TransactionScope和存储过程?

4

我有两个PL/SQL存储过程,每个过程都处理自己的事务(在出现错误的情况下进行Begin/Commit和Rollback)。从.Net代码中,我像下面所示调用这两个存储过程。

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

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

11
如果第一个存储过程SP1发出了提交(commit)命令,那么它已经做出的任何更改都将是永久性的。在这种情况下,如果SP2失败,由SP1所做的更改将不会被回滚。
个人认为,调用应用程序应该处理事务逻辑,也就是说,不要在PL/SQL过程中发出提交(commit)或回滚(rollback)。让错误传播到调用应用程序,这样PL/SQL引擎将只回滚失败过程所做的工作,而不是整个事务。
让调用应用程序在出现错误时决定怎么做(重试、提交一半的工作?还是回滚)。

2
任何过程都不应该提交——除非是程序中的最终调用者,即 main{}。而应该只做保存点/回滚操作。 - Adam Musch

2
如果SP1进行提交,那么SP2的任何操作都不会影响到它。SP1所做出的更改不会被回滚 - 它们已经被提交。

1

如果您的第一个存储过程总是执行提交或回滚操作,那么第二个存储过程所做的任何操作都不会影响该事务。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接