【问题标题】:PHP OCI auto committing when using OCI_NO_AUTO_COMMIT in oci_execute在 oci_execute 中使用 OCI_NO_AUTO_COMMIT 时 PHP OCI 自动提交
【发布时间】:2017-02-16 17:55:35
【问题描述】:

我在尝试使用oci_* 函数在我的 php 项目中自动提交插入或更新时遇到奇怪的行为。

According to the documentation 插入和更新查询应该在脚本结束时提交,除非调用了oci_commit 函数:

使用 OCI_NO_AUTO_COMMIT 模式启动或继续事务。当连接关闭或脚本结束时,事务会自动回滚。显式调用 oci_commit() 提交事务,或 oci_rollback() 中止它。

在插入或更新数据时,出于关系数据一致性和性能原因,建议使用事务。

如果 OCI_NO_AUTO_COMMIT 模式用于任何语句(包括查询),并且随后未调用 oci_commit() 或 oci_rollback(),则 OCI8 将在脚本末尾执行回滚,即使没有更改数据。为避免不必要的回滚,许多脚本不使用 OCI_NO_AUTO_COMMIT 模式进行查询或 PL/SQL。在同一脚本中以不同模式使用 oci_execute() 时,请注意确保应用程序具有适当的事务一致性。

当我在 oci_execute 函数中使用 OCI_NO_AUTO_COMMIT 作为第二个参数执行 INSERT 查询,然后在脚本结束之前调用 oci_rollback 函数时,数据未提交 - 正如预期的那样。但是,如果我执行相同的过程并且在脚本结束之前不调用 oci_rollback 函数(也不是 oci_commit 函数),则数据将被提交。我错过了什么?我误解了文档吗?

以下代码提交插入,这不是我所期望的。

$sqlString  = "INSERT INTO table1 (col1) VALUES ('test')";
$stid = oci_parse($dbConnection, $sqlString);
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);

注意:该项目正在运行 PHP7 和 OCI8。

【问题讨论】:

  • 我无法使用PHP/7.0.15OCI8/2.1.3InstantClient/12.1.0.2.0(Windows 10 上的所有x64)插入到 11gR2 服务器来重现此问题。简单地添加或删除 OCI_NO_AUTO_COMMIT 参数会导致发生记录的行为(提交或回滚)。

标签: php oci8 autocommit


【解决方案1】:

检查您没有执行后续 DDL 语句(例如 CREATE TABLE),因为这将触发数据库提交。

【讨论】:

    【解决方案2】:

    我在调用过程时遇到了类似的问题(我想等待它们都成功提交,如果没有回滚它们)。

    问题是有些人在程序末尾添加了COMMIT; 语句,我必须删除它才能工作。

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多