2010-03-05 80 views
3

我有两个PL/SQL存储过程,每个都处理自己的事务(在出错时开始/提交和回滚)。从.Net代码我调用这两个SP如下所示。TransactionScope和存储过程?

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

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

回答

10

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

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

让调用应用程序决定在发生错误时应该怎么做(重试,提交半工作或回滚)。

+2

+1。没有过程应该提交 - 它只应该保存点/回滚 - 除非它是最终的调用者;程序中的主要{}。 – 2010-03-05 21:05:16

2

如果SP1执行提交,那么SP2中会发生什么并不重要。 SP1中所做的更改不会回滚 - 它们已被提交。

1

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

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