您可以在一個存儲過程中啓動事務,然後將其回滾或在嵌套過程中提交它?如何通過多個存儲過程使用事務?
回答
提交和回滾有不同的效果
- 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?
你不能在一個嵌套過程中提交它,但是啓動一個事務將包裝所有嵌套過程。所以這個事務對嵌套在事務中的所有存儲過程都是有用的。在分佈式事務中,數據完整性甚至跨越機器邊界。
http://msdn.microsoft.com/en-us/library/ms188929(v=SQL.90).aspx
你應該配對的BEGIN TRAN,並在同一個存儲過程COMMIT後
如果然後調用另一個存儲過程裏面也有一個交易,隨後BEGIN TRAN/COMMIT TRAN對將遞增和遞減@ @Trancount分別。
該事務被提交的 '最後' COMMIT TRAN(@@ TRANCOUNT = 1)
然而,任何ROLLBACK將總是回滾事務。
MSDN有很好的解釋。
是的,這是可能的。使用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();
}
- 1. 通過多個表,並存儲過程
- 2. 存儲過程事務
- 3. 如何在存儲過程中使用每個存儲過程?
- 4. 每個事務有多少個存儲過程調用?
- 5. 用於多個存儲過程調用的spring事務管理
- 6. 使存儲過程通用
- 7. 在事務中調用多個SQL Server存儲過程
- 8. 如何創建使用事務的存儲過程?
- 9. 如何同時使用事務和存儲過程?
- 10. 通過使用存儲過程
- 11. 使用多個存儲過程
- 12. 存儲過程調用多個存儲過程
- 13. 如何從另一個存儲過程調用存儲過程?
- 14. 如何使用c#通過webservice調用存儲過程?
- 15. mssql - 一個存儲過程vs多個存儲過程
- 16. 如何做一個沒有存儲過程的嵌套事務?
- 17. 如何編寫通用存儲過程?
- 18. 通過存儲過程
- 19. 通過存儲過程
- 20. 如何使存儲過程中的查詢知道Spring事務?
- 21. 使用XML插入多行通過存儲過程
- 22. 通過代碼映射Nhibernate,如何使用存儲過程?
- 23. 如何使用c#通過odbc執行存儲過程?
- 24. 如何通過存儲過程和參數使用DataAdapter
- 25. 如何使用存儲過程緩存?
- 26. 如何通過在存儲過程中多值參數在SSRS
- 27. Mysql的事務存儲過程中
- 28. MySql存儲過程,事務和回滾
- 29. 抑制存儲過程中的事務
- 30. 存儲過程事務回滾