在oci_execute中使用OCI_NO_AUTO_COMMIT时,PHP OCI自动提交

问题描述 投票:2回答:2

当我尝试使用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_NO_AUTO_COMMIT作为oci_execute函数中的第二个参数执行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 oci8 autocommit
2个回答
0
投票

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


0
投票

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

问题是有些人在程序结束时添加了COMMIT;语句,我不得不删除它以使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.