[前][次][番号順一覧][スレッド一覧]

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]