如何通过多个存储过程使用事务?
提交和回滚有不同的效果
- 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();
}