質問: mysqlでのdeadlockをphpで検出する方法 mysqlで、deadlockが発生した場合、強制的なrollbackが、どちらかのトランザクションにかけられます。 これは、当然ですし、いいんですが。 問題は、phpでどのようにこれを検知し、再実行をかけるには、どのようなコーディングをすればいいのかということです。 データベースの取り扱いには、pearを使っていますので、できれば、pear db で扱えると嬉しいのですが。 pear のソースで、deadlock を探したんですが、見つからないもので。 よろしくお願いします。
回答: >これは、当然ですし、いいんですが。 http://www2s.biglobe.ne.jp/~coach/onepoint/database/db_deadlock.html この話はあくまでこのサイトの方の言うことですが、デッドロックはバグなので設計を見直した方がよいです。 >検知し、再実行をかけるには phpはmysql_queryが呼ばれると結果が返るまでプログラムの実行を停止するので、ここでデッドロックが発生するとphpはタイムアウトするまで実行を停止することになります。 デフォルトの設定だとmax_execution_time < mysql.connect_timeoutなので(多分)デッドロックすると何も出来なくなります。 (set_time_limitの説明を読むとこの解釈がまちがってる可能性も考えられますが) で、検知する方法ですが単純な方法としてはクエリーの実行(もしくはトランザクション開始から終了まで)にかかった時間を測定し、mysql.connect_timeoutと比べればいいです。 mysql.connect_timeoutより実行時間が長ければロールバックしていると分かります。 ただ、アクセスが多いとクリティカルセクションが複雑に絡み合ってしまうかもしれないので、そんな状況で再実行をかけるとorz