【问题标题】:TransactionScope and Stored Procedure?TransactionScope 和存储过程?
【发布时间】:2011-01-24 04:33:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: oracle ado.net transactions plsql


    【解决方案1】:

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

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

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

    【讨论】:

    • +1。没有程序应该提交——它应该只保存点/回滚——除非它是最终的调用者;程序中的 main{}。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多