2017-02-16 8 views
1

を実行しようとしたときに奇妙な動作が発生しましたoci_*関数を使用してPHPプロジェクトに挿入または更新をコミットします。スクリプトが終了したときにoci_commit関数が呼び出されない限りoci_executeでOCI_NO_AUTO_COMMITを使用するとPHP OCIが自動的にコミットする

According to the documentation挿入および更新クエリがは、コミットすべきではありません。

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_execute機能で2番目のパラメータとして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が実行されています。

+0

11gR2サーバーに挿入した 'PHP/7.0.15'、' OCI8/2.1.3'、 'InstantClient/12.1.0.2.0'(Windows 10では' x64 ')を使って再解析することはできません。単純に 'OCI_NO_AUTO_COMMIT'パラメータを追加または削除すると、文書化された動作(コミットまたはロールバック)が発生します。 – timclutton

答えて

0

次のDDL文(CREATE TABLEなど)を実行していないことを確認すると、データベースによってコミットされます。

関連する問題