在OCI_execute中使用OCI_NO_auto_COMMIT时PHP OCI自动提交

在OCI_execute中使用OCI_NO_auto_COMMIT时PHP OCI自动提交,php,oci8,autocommit,Php,Oci8,Autocommit,当我尝试使用oci.*函数在我的php项目中NOT自动提交插入或更新时,我遇到了奇怪的行为 脚本结束时不应提交插入和更新查询,除非调用oci\u commit函数: 使用OCI_NO_AUTO_提交模式启动或继续事务。当连接关闭或脚本结束时,事务将自动回滚。显式调用oci_commit()提交事务,或调用oci_rollback()中止事务 插入或更新数据时,出于关系数据一致性和性能原因,建议使用事务 如果对包含查询的任何语句使用OCI_NO_AUTO_COMMIT模式,并且随后未调用OCI_C

当我尝试使用
oci.*
函数在我的php项目中NOT自动提交插入或更新时,我遇到了奇怪的行为

脚本结束时不应提交插入和更新查询,除非调用
oci\u commit
函数:

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

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

如果对包含查询的任何语句使用OCI_NO_AUTO_COMMIT模式,并且随后未调用OCI_COMMIT()或OCI_rollback(),则即使未更改任何数据,OCI8也将在脚本末尾执行回滚。为了避免不必要的回滚,许多脚本不使用OCI\u NO\u AUTO\u COMMIT模式进行查询或PL/SQL。在同一脚本中使用不同模式的oci_execute()时,请小心确保应用程序具有适当的事务一致性

当我在
OCI\u execute
函数中以
OCI\u NO\u AUTO\u COMMIT
作为第二个参数执行插入查询,然后在脚本结束前调用
OCI\u rollback
函数时,数据未提交-如预期的那样。但是,如果我执行相同的过程,并且在脚本结束之前不调用
oci\u rollback
函数(也不调用
oci\u commit
函数),则会提交数据。我错过了什么?我是不是误解了文件

下面的代码提交了insert,这不是我所期望的

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

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

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

调用过程时,我遇到了类似的问题(我希望等待所有过程成功提交,如果没有,则回滚所有过程)


问题是有些人添加了
COMMIT语句在过程结束时,我必须删除它才能工作。

我无法使用
PHP/7.0.15
OCI8/2.1.3
InstantClient/12.1.0.2.0
(Windows 10上的所有
x64
)插入11gR2服务器来重新编写此语句。只需添加或删除
OCI_NO_AUTO_COMMIT
参数,就会导致出现记录的行为(提交或回滚)。