2011-01-24 81 views

回答

9

提交和回滾有不同的效果

  • COMMIT遞減@@ TRANCOUNT
  • ROLLBACK將其推回零

這是因爲SQL Server不真正支持嵌套事務。

如果您提交或回滾一個嵌套的存儲過程(不交易),那麼你會產生因爲啓動和進入一個@@ TRANCOUNT不匹配

回滾的問題可以通過使用SET來解決的錯誤266 XACT_ABORT ON是「自動回滾」(簡單地)並且抑制錯誤266.

提交問題......你不能這樣。但是,您可以通過在存儲的proc條目中註釋@@ TRANCOUNT來控制它發生的位置,並且如果爲零,則只提交

對於正確的事務處理,請參閱我的答案在這裏,請: Nested stored procedures containing TRY CATCH ROLLBACK pattern?Have I to count transactions before rollback one in catch block in T-SQL?

0

你應該配對的BEGIN TRAN,並在同一個存儲過程COMMIT後

如果然後調用另一個存儲過程裏面也有一個交易,隨後BEGIN TRAN/COMMIT TRAN對將遞增和遞減@ @Trancount分別。

該事務被提交的 '最後' COMMIT TRAN(@@ TRANCOUNT = 1)

然而,任何ROLLBACK將總是回滾事務。

MSDN有很好的解釋。

0

是的,這是可能的。使用C#等編程語言時,當您使用該命令傳遞連接和事務對象時。如果有任何事情被誤認爲是回滾事務:

string customerConnection = "Connection"; 
     string query = "insert into temp values ('Data2','data1','data2','data3')"; 
     string query2 = "update tempcst set data = 'Hello data'"; 

     SqlConnection myConnection = new SqlConnection(customerConnection); 
     myConnection.Open(); 


     SqlTransaction myTrans = myConnection.BeginTransaction(); 

Try{ 

     int result = executeNonQuery(query, myConnection, myTrans, ""); 
     i = executeNonQuery(query2, myConnection, myTrans, ""); 
    myTrans.Commit();} 



    catch{ 
     myTrans.Rollback(); 
     myConnection.Close(); 
}