
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>これは、当然ですし、いいんですが。
http://www2s.biglobe.ne.jp/~coach/onepoint/datab …
この話はあくまでこのサイトの方の言うことですが、デッドロックはバグなので設計を見直した方がよいです。
>検知し、再実行をかけるには
PHPはmysql_queryが呼ばれると結果が返るまでプログラムの実行を停止するので、ここでデッドロックが発生するとPHPはタイムアウトするまで実行を停止することになります。
デフォルトの設定だとmax_execution_time < mysql.connect_timeoutなので(多分)デッドロックすると何も出来なくなります。
(set_time_limitの説明を読むとこの解釈がまちがってる可能性も考えられますが)
で、検知する方法ですが単純な方法としてはクエリーの実行(もしくはトランザクション開始から終了まで)にかかった時間を測定し、mysql.connect_timeoutと比べればいいです。
mysql.connect_timeoutより実行時間が長ければロールバックしていると分かります。
ただ、アクセスが多いとクリティカルセクションが複雑に絡み合ってしまうかもしれないので、そんな状況で再実行をかけるとorz
この回答への補足
deadlock は、バグではありません。1つのデータベースを複数のアプリケーションで使う場合、確率的に発生する可能性があります。可能性を減らすように実装するのは当然ですが。
これは、RDBMSを使用する以上、避けて通れない問題です。
実行時間を見て、判断するというような、方法ではなく、もっと、うまい方法があるのではと期待しているのですが。
あまり美しくはありませんが、一応の解決方法を見つけました。
デッドロックが起きると、どちらかを強制的に失敗させて、エラーオブジェクトを返します。
ここで、このエラーオブジェクトのuserInfoからdeadlockが起きたという情報を拾えます。
この間は、while で回すようにしました。
もっと、うまい方法があるといいんですが。
<?php
require_once('config.php');
$con = DB::connect($dsn);
$dl = true;
while($dl) {
$sql = "START TRANSACTION";
$con->query($sql);
$sql = "SELECT * FROM xxxx FOR UPDATE";
$res = $con->query($sql);
sleep(10);
$sql = "UPDATE yyyy SET x = 0";
if(DB::isError($res = $con->query($sql))) {
$ui = $res->userinfo;
if(!preg_match('/[d|D]eadlock/', $ui)) {
die('予期せぬエラー');
} else {
print('Deadlock<BR>');
}
} else {
$dl = false;
}
$sql = 'COMMIT';
$con->query($sql);
}
?>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでのdeadlockをPHPで検出...
-
サーバの作業の流れで質問です。
-
system()でssh命令文の実行結果...
-
phpスクリプトのみで定期実行
-
JSのWINOW.CONFI...
-
PHPからlhaコマンドを使いたい
-
PHPで、C#のプログラムを実行す...
-
Prompt入力値をphp変数として取...
-
phpからエクセルのマクロを実行...
-
Switch文における、returnとbre...
-
mysql_queryの処理速度が遅い
-
PHPパーミッションについて
-
PHP5で名前空間を取り扱う
-
phpのheader("Location:#pos")...
-
*.php、*.php3、*.phtmlの違い
-
Warning: Invalid argument sup...
-
データ送信をボタンを押さずに...
-
拡張子php画像をjpg画像等に変...
-
zip圧縮の種類について
-
asp.netのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェルスクリプトをPHPで動かそ...
-
mysql複数レコードをまとめて削...
-
copy() で属性保存
-
require_onceが動いていない
-
php実行中に実行中のphpファイ...
-
サーバの作業の流れで質問です。
-
コマンドラインの生成でParse e...
-
system()でssh命令文の実行結果...
-
phpからエクセルのマクロを実行...
-
Prompt入力値をphp変数として取...
-
PHPからlhaコマンドを使いたい
-
PHPにてC言語プログラムを呼び...
-
一時停止のコマンドはありますか?
-
社内LANで複数台のPCからApache...
-
execからのls grepコマンドにつ...
-
ヒアドキュメントの中で演算子...
-
httpdのプロセスが自動で消えな...
-
PHPファイルの暗号化(難読化)...
-
コマンドライン実行でDBにアク...
-
phpの実行ユーザーは設定できま...
おすすめ情報