2016-02-19 117 views
0
SELECT @@TRANCOUNT 
BEGIN TRAN T1  
SELECT @@TRANCOUNT 
    BEGIN TRAN T2    
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T2   
SELECT @@TRANCOUNT 
ROLLBACK TRAN T1 
SELECT @@TRANCOUNT   

我想在@@ trancount上討論一下。有5個@@ trancount。第一個值爲0。第二個值爲1.第三個值爲2.在第四次計算之前,它遇到一個錯誤(因爲沒有回滾的保存檢查點),所以值2將繼續。高興這我得到的邏輯。問題出現在最後@@ trancount,因爲它應該也會遇到一個錯誤(根據我的一半知識),因爲沒有回滾保存點,因此它應該保留值2.但不是它將輸出顯示爲0。請幫助我知道爲什麼最後一筆轉帳是0而不是2。SQL Server事務計數

+0

花點時間閱讀幫助中心的[編輯幫助](http://stackoverflow.com/editing-help)。堆棧溢出的格式與其他站點不同。您的帖子看起來越好,用戶就越容易幫助您。 –

+0

您的腳本失敗,ROLLBACK TRAN transaction_name必須引用最外面的事務名稱,否則它將失敗。 – Jaco

回答

0

ROLLBACK TRAN transaction_name必須引用最外面的事務名稱,否則它將失敗。您可以修復你這樣的腳本

SELECT @@TRANCOUNT 
BEGIN TRAN T1  
SELECT @@TRANCOUNT 
    BEGIN TRAN T2    
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T1 
SELECT @@TRANCOUNT 
IF @@TRANCOUNT>0 
    ROLLBACK TRAN T1 
SELECT @@TRANCOUNT  

請注意,您可以使用COMMMIT TRAN T2

0

您可以嘗試SAVE TRAN或因爲沒有定義的保存點回滾將影響整個事務。

SELECT @@TRANCOUNT 
BEGIN TRAN t1 
SELECT @@TRANCOUNT 
    BEGIN TRAN T2 
    SAVE TRAN T2 --<< 
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T2 
SELECT @@TRANCOUNT 
ROLLBACK TRAN t1 
SELECT @@TRANCOUNT 

https://msdn.microsoft.com/en-us/library/ms187967.aspx

的由1 ROLLBACK BEGIN TRANSACTION語句增量@@ TRANCOUNT 交易遞減@@ TRANCOUNT爲0,除了ROLLBACK TRANSACTION savepoint_name,這並不影響@@ TRANCOUNT。通過1

尼斯文章COMMIT TRANSACTION或COMMIT WORK減量@@ TRANCOUNT: http://www.codeproject.com/Articles/4451/SQL-Server-Transactions-and-Error-Handling

圖1:甲COMMIT總是平衡一個通過由一個減少事務計數BEGIN TRANSACTION。 enter image description here

圖2:單個ROLLBACK總是回退整個事務。 enter image description here

保存點提供了回滾事務部分的機制。 A 用戶可以在事務中設置保存點或標記。 保存點定義了事務可以返回的位置,如果事務的部分 被有條件地取消。 SQL Server允許您通過SAVE TRAN語句使用保存點 ,這不影響 @@ TRANCOUNT值。回滾到保存點(而非事務) 不會影響@@ TRANCOUNT返回的值。但是, 回退必須明確指定保存點:使用ROLLBACK TRAN 沒有特定名稱將始終回滾整個事務。

+0

謝謝你的答案。但是我想在@@ trancount上討論一下。有5個@@ trancount。第一個值爲0。第二個值爲1.第三個值爲2.在第四次計算之前,它遇到一個錯誤(因爲沒有回滾保存檢查點),所以值2將繼續。高興這我得到的邏輯。問題出現在最後一個@@ trancount,因爲它應該也會遇到一個錯誤,因爲沒有回滾的保存點並保留2.但是,它不會顯示輸出爲0.請幫助我知道爲什麼最後一個trancount是0爲2. – 234

+0

對不起,我沒有看到問題出在哪裏。 T1是整個交易。用'BEGIN TRAN EXEC('...來自答案...')SELECT @@ TRANCOUNT ROLLBACK'圍住它,你會得到一個關於T1丟失保存點的錯誤。因爲它變成了嵌套事務。 –