PHP アプリケーションに ADOdb ライブラリを使用しています。
このアプリケーションは Oracle 9g でスムーズに動作しますが、新しいサーバーに転送すると、次のエラーがスローされることがよくあります。
ORA-08177: このトランザクションのアクセスをシリアライズできません
私が使用している oci_8.dll の問題でしょうか? php_oci8_11g.dll に更新する必要がありますか?
このエラーは、分離レベルが に設定されserializable
ていて、他のテーブルでも DML を実行しているテーブルで DML を実行していた場合に発生します。
そのような分離レベルを設定して DML を実行していますか? もしそうなら、なぜ標準がread committed
適切でないのでしょうか?
例えば:
誰かが行を削除します
ANOTHER SESSION YOUR SESSION
SQL> delete from a where id = 1;
1 row deleted.
コミットはまだ行われていません..その間、SERIALIZED トランザクションは同じ行を削除しようとします...
SQL> alter session set isolation_level=serializable;
Session altered.
SQL> delete from a where id = 1;
他のセッションがロックされているため、この時点でセッションがハングします。その他のセッションが今コミットする場合:
SQL> commit;
Commit complete.
あなたのセッションはそのエラーに遭遇します:
delete from a where id = 1
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction