我应该在哪里提交交易 - 在存储过程中还是在调用应用程序代码中?

时间:2010-01-29 14:45:10

标签: php oracle stored-procedures transactions

我正在使用PHP + Oracle,并且想知道是否有关于在哪里提交我的交易的建议。我调用存储过程来执行所有插入/更新/删除操作,并且当前正在我的存储过程结束时提交。

我在想:

  1. 两者之间有什么区别吗? 在我存储的中调用commit / rollback 过程与调用oci_commit / oci_rollback在我的PHP代码基础上 存储过程的成功 调用

  2. 哪个更好?本来 我正在考虑存储 程序本身,但现在我 想知道,如果没有区别, 也许它会给我更多 在呼叫中提交的灵活性 我打电话给应用程序代码 一个存储过程中的几个 单一交易而不是 不得不写新的存储 每次我想要的程序 混合/匹配各种SQL 单一交易中的陈述。

  3. 思想?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

选项2是一般规则。如果您的存储过程中有提交,那么无论是谁给我打电话,您都会做出决定,我知道更好,并且在完成工作后应该进行任何未完成的交易。

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

让呼叫者决定交易会发生什么事情几乎总是可取的。一个正常的例外是针对需要它的案例的过程内的自治事务。

答案 2 :(得分:3)

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