mysql:15596
From: <gotou1213@xxxxxxxxxx>
Date: Thu, 26 May 2011 15:55:30 +0900
Subject: [mysql 15596] SELECT MAX 〜 FOR UPDATE と INSERT でデッドロック
後藤と申します。 MySQLで次の通りにテーブルが存在しているときに CREATE TABLE xx (id INT NOT NULL PRIMARY KEY); INSERT INTO xx VALUES (1); 下記の様に [A] と [B] のトランザクションを並列に実行したところ、 [A] BEGIN; [B] BEGIN; [A] SELECT @a:=MAX(id) FROM xx FOR UPDATE; [B] SELECT @a:=MAX(id) FROM xx FOR UPDATE; /* ロック解放待ち */ [A] INSERT INTO xx VALUES(IFNULL(@a,0) + 1); /* デッドロック? */ [A]のINSERTで以下の通りエラーになりました。 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction たまに発生するとかでは無くて、上の順番で実行すると百発百中で発生します。 上記の様な方法で連番を生成する是非はともかくとして、 デッドロックをしてしまう理由がわかりません。 MySQLのバージョンは以下の通りです(CentOS 5.5のyumで入るバージョン)。 mysqld Ver 5.0.77-log for redhat-linux-gnu on x86_64 (Source distribution) 理由についてご存知の方がいらっしゃいましたら、 ご教授いただければ幸いです。
-> 15596 2011-05-26 15:55 [<gotou1213@xxxxxxxxx] SELECT MAX 〜 FOR UPDATE と INSERT でデッドロック 15597 2011-05-26 17:38 ┗[KOJIMA Takanori <tak] 15598 2011-05-26 20:19 ┗[<gotou1213@xxxxxxxxx] 15599 2011-05-26 20:28 ┗[<gotou1213@xxxxxxxxx]