TransactionScope和存储过程?

时间:2010-03-05 16:03:29

标签: oracle ado.net transactions plsql

我有两个PL / SQL存储过程,每个过程处理自己的事务(如果发生错误,则开始/提交和回滚)。来自.Net代码我将这两个SP称为如下所示。

   using (TransactionScope ts = new TransactionScope())
     {
          CallSP1();
          CallSP2().
          ts.SetComplete();
     }

如果我的SP2调用失败,它会回滚CallSP1()所做的更改吗?如果它没有回滚那么这是否意味着它更好地从.Net应用程序而不是在存储过程内处理事务?

3 个答案:

答案 0 :(得分:10)

如果第一个存储过程SP1发出提交,那么它已经进行的任何更改都将是永久性的。在这种情况下,如果SP2失败,SP1将进行的更改将不会回滚。

IMO调用应用程序应该是处理事务逻辑的应用程序,即不在PL / SQL过程中发出提交或回滚。让错误传播到调用应用程序,这样PL / SQL引擎将只回滚失败过程而不是整个事务所完成的工作。

让调用应用程序决定在出现错误时做什么(重试,提交半工作?或回滚)。

答案 1 :(得分:2)

如果SP1执行提交,则SP2中发生的情况无关紧要。在SP1中所做的更改将不会回滚 - 它们已被提交。

答案 2 :(得分:1)

如果您的第一个存储过程始终发出提交或回滚,则第二个存储过程不会影响该事务。

如果希望调用应用程序控制整个事务,但存储过程要处理在发生错误时回滚自己的更改,一种方法是在存储过程的开头定义一个保存点。然后,存储过程的异常块可以回滚到保存点,而不是事务的开头(在这种情况下,提交不应该包含在存储过程中)。当然,在这种情况下,存储过程通知应用程序发生错误以及应用程序正确处理该情况非常重要。