予期しない動作が発生しています。PHP/OCI8 経由で開始される同期プロシージャがあります。プロセスの最初に、SELECT...FOR UPDATE NOWAIT
これはNOWAIT
、ブラウザーがロックされるのを待つのではなく、プロセスが既に実行されているというエラー メッセージをユーザーにすぐに通知するためです。
2 つの別々の PHP セッションを持つ 2 つの別々のコンピューターからプロセスを実行すると、期待どおりの動作が得られますORA-00054: resource busy and acquire with NOWAIT specified
。
しかし、同じブラウザーで 2 つのタブを開いてプロセスを実行すると、2 番目のタブは最初のタブが終了するまで 30 秒以上待機し、2 番目のタブを実行しますNOWAIT
。
永続的な接続や接続プーリングは一切使用していません。別の HTTP リクエストで別の PHP=>Oracle 接続を実行すると、別の DB セッションが得られると思いました。そうではありませんか?
更新:私はこれを見つけました: http://wiki.oracle.com/page/PHP+Oracle+FAQの下 #6、OCI8 拡張機能を使用して Oracle に接続するにはどうすればよいですか? それは言います:
スクリプトまたは httpd サーバー セッションで同じユーザー資格情報が複数回使用されている場合、PHP は接続を共有/再利用します。oci_new_connect() 関数を使用して、新しいセッションが使用されるようにすることができます。oci_pconnect() 関数を呼び出して、スクリプトの最後で閉じられない永続的な接続を作成します (次のスクリプトでの再接続がはるかに高速になります)。
ただし、変更しoci_new_connect
ても問題は解決しません。異なるコンピューター上の異なるセッションは をスローしORA-00054
ますが、同じブラウザーの 2 つのタブはアクセスを同期しますが、NOWAIT
.