
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で質問しましょう!
似たような質問が見つかりました
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- PHP PHP & MySQL: Server-side Web Development ペーパ 1 2022/04/19 19:23
- MySQL [1000地域 × 10カテゴリー = 1万件のテーブル]!グループ化? 1 2023/06/14 23:56
- MySQL 私の考えていることは ・mySQL ・PHP ・web制作 この三つのスキルがあれば実現しますか? 4 2023/08/19 02:48
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP 「基礎からのMySQL 第3版 Kindle版」を数年前購入して全部やりました。 1 2022/09/15 05:32
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- PostgreSQL PostgressからMySQL(MariaDB)へ構造を変更する際のTimestamp等について 2 2023/04/04 12:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPからCRONの編集
-
httpdのプロセスが自動で消えな...
-
JSのWINOW.CONFI...
-
phpのプログラムで一定間隔で処...
-
PHPでexecやpassthruすると
-
PHP 上で ImageMagick のコマン...
-
スクリプトを実行すると警告が...
-
phpでアクセス権の設定
-
PHPでCGIをするのは
-
PHPからシェルコマンドの実行
-
シリーズから探すのような検索...
-
PHPファイルをCron設定からのみ...
-
function_exists関数の挙動につ...
-
Maximum execution time of 30 ...
-
phpスクリプトから、crontabを...
-
ブラウザからexecコマンドを実...
-
よくわからなかったので試して...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
シェルスクリプトをPHPで動かそ...
-
PHPでコマンドプロンプトを実行...
-
require_onceが動いていない
-
ヒアドキュメントの中で演算子...
-
PHPでサーバーにインストールさ...
-
php実行中に実行中のphpファイ...
-
社内LANで複数台のPCからApache...
-
ブラウザからexecコマンドを実...
-
PHPからバッチファイルの実行
-
Switch文における、returnとbre...
-
PHPからPostgreSQLのダンプを実行
-
正常に動作しない
-
htmlでsubmitで指定したAction...
-
PHPファイルをcronで実行す...
-
[cakePHP]外部ファイルの実行方法
-
テルネットしコマンドを自動実行
-
copy() で属性保存
-
PHP+MySQLでrollback出来ない
-
入力してからn時間(日)後、DBデ...
おすすめ情報