使用OCI_NO_AUTO_COMMIT当我试图不汽车时遇到奇怪的行为触犯使用oci_*
功能提交插入或更新在我的PHP项目。PHP OCI汽车在oci_execute
According to the documentation插入和更新查询应不被脚本结束时,承诺除非oci_commit
函数被调用:
使用OCI_NO_AUTO_COMMIT模式开始或继续交易。事务会在连接关闭或脚本结束时自动回滚。显式调用oci_commit()来提交事务,或者oci_rollback()来中止它。
插入或更新数据时,建议使用事务处理关系数据一致性和性能方面的原因。
如果OCI_NO_AUTO_COMMIT模式用于包含查询的任何语句,并且oci_commit()或oci_rollback()未随后调用,则即使没有数据更改,OCI8也会在脚本末尾执行回滚。为避免不必要的回滚,许多脚本不会对查询或PL/SQL使用OCI_NO_AUTO_COMMIT模式。在同一脚本中使用不同模式使用oci_execute()时,请注意确保应用程序的适当事务一致性。
当我执行与OCI_NO_AUTO_COMMIT
一个INSERT查询作为oci_execute
函数第二个参数,事后调用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'参数就会导致记录的行为(提交或回滚)发生。 – timclutton