1

抱歉,这是一个很难说的问题:

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

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

4

2 回答 2

1

是的,它将被回滚。

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

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

于 2012-07-18T17:06:19.690 回答
1

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

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

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

于 2012-07-18T17:07:05.030 回答