2016-09-28 30 views
1

我可以在存儲過程中2個事務象下面這樣?如果我回滾TRAN1,它是否回滾所有TRAN2?我迷失在這裏,任何反饋都會有幫助。在此先感謝我可以開2次交易不同的名稱

BEGIN TRANSACTION TRAN1 

WHILE(...) 
BEGIN 

    BEGIN TRANSACTION TRAN2 

    BEGIN TRY 
      ..... 
      ..... 
      ..... 
      COMMIT TRANSACTION TRAN2   
    END TRY 
    BEGIN CATCH 
      ROLLBACK TRANSACTION TRAN2 
    END CATCH 
END 

COMMIT TRANSACTION TRAN1 
+1

您可能需要閱讀此:https://technet.microsoft.com/en-us/library/ms189336(v=sql.105).aspx – Nebi

回答

3

不管,你有多少交易有,外回滾回滾所有的交易..

當你喜歡你的情況嵌套事務,每個committ /回滾增加或減少@@ TRANCOUNT ..

從MSDN ..

每一個BEGIN TRANSACTION語句增量@@ TRANCOUNT。每個COMMIT TRANSACTION或COMMIT一個WORK語句遞減@@ TRANCOUNT。

使用最外事務的事務名稱在一組嵌套事務的

回滾事務回滾所有嵌套的事務和遞減@@ TRANCOUNT至0

的見這個問題,以及:A SQL Server DBA myth a day: (26/30) nested transactions are real

以下是演示,以測試這種行爲..

if object_id('t1','u') is not null 
drop table t1 

create table t1 
(
id int 
) 

go 

begin tran outertran 

select @@trancount--1 
insert into t1 
select 1 

begin tran innertran 

select @@trancount--2 

insert into t1 
select 2 



/**below throws error,since you can reference only outer transaction 
-referrring inner tran is not legal 
***/ 
--rollback tran innertran 

/*** 
error you get by uncommneting above 
Msg 6401, Level 16, State 1, Line 20 
Cannot roll back innertran. No transaction or savepoint of that name was found. 
**/ 

commit tran innertran 
select @@trancount--1 

rollback --rollbacks all 

select * from t1 

參考文獻:
http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/

相關問題