事务中的DB过程仍然会从ADO.net事务中回滚吗



对不起,这是一个很难回答的问题:

假设我有一个执行某些插入的存储过程。它被封装在一个事务中并提交,前提是每个事务都在该事务内部进行。

现在,我从.net函数调用该事务。在这个函数中,我必须调用其他一些函数,这些函数也调用以类似方式构建的存储过程。示例:

bool SaveTicket()
{
   using(MyTransaction)
   {
      try
      {
         SaveTicketInfo(); //calls sproc 1
         SaveComments(); //calls sproc 2
         SaveAttachments(); //calls sproc 3
      }
      catch(Exception)
      {
         MyTransactionRollback(); //i would normally wrap this in its own try/catch
      }
   }
}

好的,这就是这个过程的框架。我在代码中实际做的是检查三个进程中每个进程的返回值,如果它们返回false,我会抛出一个异常,触发回滚。

我想知道的是,如果这些存储过程中有提交,我在.net函数中的回滚是否仍然有效?还是完全没用?

是的,它将被回滚。

SQL Server中的事务可以嵌套。SQL Server基本上忽略了内部事务,关闭内部事务的唯一方法是提交它(即,要提交外部事务,必须提交所有内部事务)。回滚语句仅适用于最外层的事务。

您可以在此处阅读更多信息:http://msdn.microsoft.com/en-us/library/ms189336(v=sql.105).aspx

我想我首先会问您是否真的需要在存储过程中有单独的事务——将它们放在那里确实会使维护应用程序代码变得更加困难,并将应用程序逻辑放在持久性存储中。

我的直觉是,由于存储过程创建并提交自己的事务,当MyTransaction回滚时,这些事务不会回滚,但真正的答案可能取决于DTC的配置方式。

有关更多详细信息,请参阅此答案

最新更新