如何通过多个存储过程使用事务?

如何通过多个存储过程使用事务?

问题描述:

您可以在一个存储过程中启动事务,然后将其回滚或在嵌套过程中提交它?如何通过多个存储过程使用事务?

提交和回滚有不同的效果

  • 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(); 
}