2012-11-08 46 views
1

我的SQL-Server我的SQL-Server學習曲線已經回到前面,幾年後,我正在努力有效地使用TRANSACTION代碼。如果沒有回滾,ROLLBACK TRANSACTION是否意味着提交

如果COMMIT TRANSACTION沒有明確說明,那麼在ROLLBACK TRANSACTION的位置上,如果在前面的代碼中沒有發生錯誤,事務會被提交嗎?現在的問題是與類似下面的結構連接:

USE MyDataBase; 
GO 
    BEGIN TRANSACTION; 
     --complex query X here 
    ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.'; 
GO 

...我想ROLLBACK TRANSACTION是在一個情況下使用,你不想一個數據庫進行的更改,如果錯誤在已發生前面的腳本 - 在上面這將是X。如果我想在上面明確說明COMMIT TRANSACTION那麼它應該放在哪裏?

爲了讓我更加困惑,我得到了以下 - 爲什麼它回滾兩次?發生錯誤以創建ROLLBACK

USE WHAnalysis; 
GO 
    BEGIN TRANSACTION; 

     IF @@TRANCOUNT = 1 
      SELECT @@TRANCOUNT 
      --do a complex query here 

    ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.'; 
GO 

回答

0

否。事務將保持打開狀態並且未提交,直到它被提交,這最終可能會導致數據庫阻塞。

如果事務被嵌套,回滾將回滾到外部事務,而不是內部事務的開始 - 見http://msdn.microsoft.com/en-us/library/ms181299.aspx

我會考慮的結構類似

begin try 
     begin tran 
     -- do query 
     commit tran 
end try 
begin catch 
     if @@trancount>0 
     begin 
      rollback 
     end 
     -- handle error here 
end catch 
+0

測試有一個簡單的腳本我可以替換' - 做查詢',以便創建一個錯誤? – whytheq

+0

這是一個通用的'T-SQL'設計模式,你用了很多? – whytheq

+0

嘗試'選擇10/0'。是。 – podiluska

相關問題