#mysql前回に続いて、今回はDELETEの空振りによってデッドロックが発生するケースをテストコードによって再現させてみる。endendDELETEの条件に一致するレコードがない場合、条件の値を含む区間に対してギャップロックが取得される(参考)。今回のように1件もレコードがない場合や指定した値が最大の値より大きい場合はsuprenumに対するネクストキーロックになる。ギャップロックはINSERTを停止させるものの、ギャップロック同士では影響を与えないため(参考)、2回目のDELETEがロック取得待ちになることはない。その結果、2つのトランザクションでINSERTがギャップロックによってロック取得待ちになり、デッドロックが発生する。#test_avoid_deadlockのように条件に一致するレコードがあった場合、セカンダリインデックスのマッチしたレコードに対してネクストキーロックを取得する。マッチしたレコードの前にギャップロックを取得するため、条件と同じ値のINSERTはロック取得待ちにならずに成功する。