【问题标题】:Where should I commit a transaction -- in the Stored Procedure or in the calling application code?我应该在哪里提交事务——在存储过程中还是在调用应用程序代码中?
【发布时间】:2011-01-10 21:10:16
【问题描述】:

我正在使用 PHP + Oracle,想知道是否有关于在何处提交我的事务的建议。我调用存储过程来完成我所有的插入/更新/删除,并且目前正在我的存储过程结束时提交。

我想知道:

  1. 两者有什么区别吗 在我的存储中调用提交/回滚 过程与调用 oci_commit / 我的PHP代码中的oci_rollback基于 存储过程的成功 打电话。

  2. 哪个更可取?起初 我在想在存储 程序本身,但现在我 想知道,如果没有区别, 也许它会给我更多 在通话中提交的灵活性 应用程序代码,因为我可以调用 几个存储过程在一个 单笔交易而不是 不得不写新的存储 每次我想要的程序 混合/匹配各种 SQL 单个事务中的语句。

想法?

【问题讨论】:

    标签: php oracle stored-procedures transactions


    【解决方案1】:

    不确定 PHP/Oracle,但我们的 SQL 过程会检查它们是否已经在事务中。如果他们是,他们只是做他们所做的。如果不是,他们会创建一个事务并自己提交/回滚。这给了我们灵活性,特别是对于从多个不同进程调用的过程。

    【讨论】:

    • 有趣的想法。我想看看检测机制。有链接吗?
    • 我们只是使用 SQL Server 内置的@@TRANCOUNT
    【解决方案2】:

    出于您给出的原因,我绝对同意选项 2。让每个存储过程充当单独的事务有时可能会受到太大限制。 Tom Kyte 也会支持选项 2:例如,请参阅 this AskTom thread

    【讨论】:

    • 感谢您的链接...它是正确的。
    【解决方案3】:

    选项 2 作为一般规则是可行的方法。如果您在存储过程中进行了提交,那么您将做出一个决定,即无论谁给我打电话,我都知道得更好,并且应该在我完成工作时提交任何打开的事务。

    假设您有一个包含多个步骤的流程,需要全部提交或全部回滚。如果该进程碰巧调用了其中一个具有提交的存储过程作为其工作的一部分,那么到那时为止的所有内容都可以由该存储过程提交。

    让调用者决定事务应该发生什么几乎总是更可取的。一个正常的例外是程序内部的自治事务,用于特别需要它的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-04
      • 2012-02-25
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多