0

予期しない動作が発生しています。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.

4

2 に答える 2

0

さて、これはデータベースの問題ではありません。代わりに、Firefox 3.6.6 が私の同時リクエストをキューに入れたようで、結局 PHP または DB セッションの問題ではありませんでした。その問題の調査については、この質問を参照してください: Firefox は同じページのリクエストを同期しますか?

于 2010-07-19T19:39:04.213 に答える
0

「loadsession」と「savesession」があることを思い出してください。

セッションドライバーの動作によっては、この間隔で別のプロセスが php セッションを更新する可能性があります。

于 2010-07-19T15:59:36.200 に答える