【发布时间】: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.15、OCI8/2.1.3、InstantClient/12.1.0.2.0(Windows 10 上的所有x64)插入到 11gR2 服务器来重现此问题。简单地添加或删除OCI_NO_AUTO_COMMIT参数会导致发生记录的行为(提交或回滚)。
标签: php oci8 autocommit