对不起,这是一个很难回答的问题:
假设我有一个执行某些插入的存储过程。它被封装在一个事务中并提交,前提是每个事务都在该事务内部进行。
现在,我从.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的配置方式。
有关更多详细信息,请参阅此答案