Deadlock found when trying to get lock

アプリのコードが`必ず1トランザクションで1つのテーブルしか触ってない'コードなのに
Deadlock found when trying to get lockが検出されることがある。
<略>
デッドロックというより、単純なロック競合な訳だけれども、
Deadlock found when trying to get lockで検出されるというお話。
身に憶えのないDeadlock found when trying to get lock

InnoDB をデフォルトのトランザクション分離レベル(REPEATABLE READ) で使うと結構起こる。
他の DB と同じ感覚(READ COMMITTED)で使うとハマる。
データ的には競合しないはずでもインデックスが効かずギャップロックが起きて競合する。

http://www.mysqlperformanceblog.com/2012/03/27/innodbs-gap-locks/ http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-record-level-locks.html