2016-05-31 121 views
0

實際上,我對在存儲過程中使用嵌套事務有點困惑。 我需要在一個主要程序中調用兩個/三個程序。嵌套存儲過程中的嵌套事務

如:

Begin try 

Begin Tran -- 1st level transcation 

Procedure 1 --will be executed 

Procedure 2 --will be executed 

End tran -- 1st level transcation 
End try 
Begin Catch 
Rollback tran 
End Catch 


PROCEDURE 1: 

BEGIN TRAN TRAN1 
///scripts 
COMMIT TRAN TRAN1 


PROCEDURE 2: 

BEGIN TRAN TRAN2 
///scripts 
COMMIT TRAN TRAN2 

我在做它在一個正確的方式?

+0

時PROC1或PROC2失敗會發生什麼? –

+0

無法回滾TRAN1。沒有找到該名稱的事務或保存點。 –

回答

0

提交內部事務被SQL Server數據庫引擎忽略。根據在最外層事務結束時採取的操作,事務被提交或回滾。如果外部事務被提交,則內部嵌套事務也被提交。如果外部事務回滾,那麼無論內部事務是否單獨提交,所有內部事務也會回滾。

請參考鏈接 https://technet.microsoft.com/en-us/library/ms189336%28v=sql.105%29.aspx

0

有作爲nested transactions沒有這樣的事情。如果你想回滾只是交易的一部分,那麼我應該使用savepoints。關於保存點,如果COMMIT TRANSACTION SavepointName執行ROLLBACK後,這最後ROLLBACK語句將回滾everythint包括保存點定義部分:

BEGIN TRANSACTION -- A 

SAVE TRANSACTION SavePoint1 -- B 
-- do something 
COMMIT TRANSACTION SavePoint1 -- C 

-- ... 
-- This ROLLBACK will rollback everything including data committed for SavePoint1 - it will rollback also actions for [B,C] range 
ROLLBACK -- D 

如果我會用保存點,然後我會用下面從here模板(見Example)。

0

BEGIN TRANSACTION => @@ TRANCOUNT = @@ TRANCOUNT + 1
COMMIT TRANSACTION => @@ TRANCOUNT = @@ TRANCOUNT - 1(如果0節省的變化)
回滾事務=> @@ TRANCOUNT = 0(並放棄更改)

在你的外部過程只是做

BEGIN TRY 
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION 
    .. 
END TRY