2012-08-01 70 views
10

嗨,我目前對TSQL中嵌套事務的理解是,如果你有多個事務(多個事務嵌套在一個「外部」事務中),所有的事務都必須提交(使用「外部」事務是最後一個)對數據庫進行的任何更改。如果提交的數量少於未完成交易的數量,則不做與任何交易相關的更改。這是嵌套事務處理的正確概述嗎?TSQL中的嵌套事務

回答

12

您對COMMIT的描述是正確的。

Kalen Delaney has an article covering the same type of behavior that you describe.

然而,如在卡倫的文章中討論,嵌套事務內的ROLLBACK將其中發生回滾回滾整個外交易,不只是內部事務。

注意以下結果:

BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 

ROLLBACK TRAN 
SELECT @@trancount 

這MSDN文章中所描述的,Nesting Transactions

的ROLLBACK WORK或ROLLBACK TRANSACTION語句不具有 事務名回滾所有嵌套事務並將 @@ TRANCOUNT減少爲0.使用事務的ROLLBACK事務 一組嵌套事務中最外層事務的名稱 將回滾所有嵌套事務並將@@ TRANCOUNT 減少爲0.如果您不確定是否已處於事務中,請選擇 @@ TRANCOUNT以確定它是否爲1或更多。如果@@ TRANCOUNT爲0,那麼您的 不在事務中。

3

總之,你的回答是肯定的。從Nesting Transactions

提交內部事務被SQL Server數據庫 引擎忽略。該交易根據 在最外層交易結束時採取的行動提交或回滾。如果提交外部事務 ,則內部嵌套事務也提交 。如果外部交易回滾,則所有內部交易也會回滾,而不管內部交易是否單獨提交。

關於ROLLBACks,只允許ROLLBACK整個外部事務。