3

當在一個SP中完成BEGIN TRANS - COMMIT TRANS並且在TransactionScope中執行多個SP時會發生什麼,並且在完成範圍之前拋出錯誤。使用TransactionScope執行包含BEGIN TRANS - COMMIT TRANS的多個SP

所以僞代碼如下

//Using TransactionScope() { 
// executing SP1 
// executing SP2 
// executing SP3 
// throw new Exception(); 
//} 

SP2包含如下代碼。

// BEGIN TRANS 
// Update Statement1 
// Update Statement2 
// Update Statement3 
// COMMIT TRANS 

如果我們假設事務在SP2中提交,會發生什麼?

  1. 一切都被回滾SP2
  2. 3語句被提交。其他一切都會回滾?

我不知道它是否重要,但爲防萬一,所有三個SP都使用一個連接對象執行,並且連接在兩個ExecuteNonQuery語句之間重新關閉並重新打開。

+1

如果任何SP發生錯誤,事務將被回滾。如果SP2提交但SP3引發錯誤,則不會發生更新,整個事務將回滾。 – praveen

+0

@praveen你爲什麼沒有發佈它作爲答案? – IsmailS

+0

這是我的錯。無論如何,如果我的回答以任何方式幫助你,我會更高興 – praveen

回答

2

只有一個事務,總是最外層的事務範圍啓動的最外層事務。所有其他內部事務處理作用域和T-SQL代碼中發生在最外層事務處理作用域中的所有其他BEGIN TRANSACTION都只是@@TRANCOUNT的美化增量,並且所有這些COMMIT都是相同的遞減。只有最後一個COMMIT是重要的,直到事務沒有提交。

所以在你的例子中,SP2沒有提交任何東西。它所做的只是將@@ TRANCOUNT遞增爲2,然後遞減爲1.事務處於活動狀態,並且在C#代碼拋出事務時回滾。

作爲附註,請參閱Exception handling and nested transactions瞭解如何編寫好的異常安全存儲過程的模板。

+0

如果沒有我做任何事情,答案如何得到接受? – IsmailS

+0

無論如何,非常感謝您的回答:) – IsmailS

+0

@iSid不接受:) –

相關問題