2012年7月7日土曜日

身に憶えのないDeadlock found when trying to get lock

アプリのコードが`必ず1トランザクションで1つのテーブルしか触ってない'コードなのに
Deadlock found when trying to get lockが検出されることがある。

InnoDBのデッドロック検出にはいくつかパターンがあるけれども、
たとえ1つのテーブルしか存在していなくてもデッドロックとして検出されるケースがあって、

1) あるトランザクションがある行にロックをかける
2) 後続のトランザクションが同じ行にロックをかけようとしてロック待ちになる
2') 2)のようなトランザクションが複数ロック待ち行列に入る
3) 最初の行ロックをリリースする
4) 複数のロック待ちトランザクションのうち、1つだけが有効に処理され、
  その他のトランザクションはデッドロックとして検出される

デッドロックというより、単純なロック競合な訳だけれども、
Deadlock found when trying to get lockで検出されるというお話。


【2013/07/30 19:32】
このレポート(http://bugs.mysql.com/bug.php?id=69835)のコメントで知ったんですが、昔からずっと知られていた(?)んですねこの挙動。

http://bugs.mysql.com/bug.php?id=43210

http://bugs.mysql.com/bug.php?id=43591

0 件のコメント :

コメントを投稿