
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPからバッチファイルの実行
-
mysql複数レコードをまとめて削...
-
PHPのユーザと権限
-
初めて投稿させていただきます。
-
シェルスクリプトをPHPで動かそ...
-
MySQLでのdeadlockをPHPで検出...
-
httpdのプロセスが自動で消えな...
-
PHPでコマンドプロンプトを実行...
-
CRON でPHPスクリプトをGET変数...
-
PHP5で名前空間を取り扱う
-
query、prepare、executeの違い
-
require_onceが動いていない
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
CFileDialogの最初のディレクト...
-
VBSの「MsgBox」について
-
zip圧縮の種類について
-
レンタルサーバーのセッション...
-
PHPSpreadsheetによる書き出し...
-
Subversionのリポジトリの削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
phpからエクセルのマクロを実行...
-
php実行中に実行中のphpファイ...
-
シェルスクリプトをPHPで動かそ...
-
MySQLでのdeadlockをPHPで検出...
-
【PHP】命令は記述順に処理...
-
Switch文における、returnとbre...
-
PHPでサーバーにインストールさ...
-
copy() で属性保存
-
PHPから環境変数'PATH'が使えない
-
ヒアドキュメントの中で演算子...
-
htmlでsubmitで指定したAction...
-
PHPからシェルコマンドの実行
-
PHPのCGIモードとについて
-
社内LANで複数台のPCからApache...
-
httpdのプロセスが自動で消えな...
-
別サーバのプログラムを起動
-
eclipseのlocalhostの設定について
-
PHPからバッチファイルの実行
-
cronでphpを実行できない
おすすめ情報