事务中的DB过程是否仍会从ADO.net事务中回滚?

时间:2012-07-18 16:59:47

标签: .net database tsql c#-4.0 transactions

对不起,这是一个难以理解的问题:

假设我有一个插入的存储过程。它被包装在一个事务中并提交,前提是每个事务都在该事务内部完成。

现在,我从.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功能中的回滚是否仍然有效?还是完全没用?

2 个答案:

答案 0 :(得分:1)

是的,它将被回滚。

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

您可以在此处详细了解:http://msdn.microsoft.com/en-us/library/ms189336(v=sql.105).aspx

答案 1 :(得分:1)

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

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

有关详细信息,请参阅this answer