2017-02-16 64 views
1

使用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。

+0

我不能使用'PHP/7.0.15','OCI8/2.1.3','InstantClient/12.1.0.2.0'(Windows 10上的所有'x64')插入11gR2服务器。只需添加或删除'OCI_NO_AUTO_COMMIT'参数就会导致记录的行为(提交或回滚)发生。 – timclutton

回答

0

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