主キーとさらにインデックスを付けた属性だけが存在するテーブルです。CHARSET=utf8mb4;データデータを用意します。一応ギャップロックとかいう話も出てくるのでギャップが存在するように飛び飛びのデータを入れてみます。これまたわかりやすい。40);デッドロックさてここで用意ができましたので、問題を再現してみたいと思います。ここでトランザクション1(Trx1)とトランザクション2(Trx2)という二人のお友達に協力してもらおうと思います。上から順に時系列で記載します。左側にどちらのトランザクションが実施したかという情報を記載します。ここでTrx2もロックを取得できずに待ち状態となり、Trx1とのデッドロック状態となりますということでこれがどういう仕組でデッドロックするか理解している方、これ以上この記事を見る必要はないです。おき、問題が確認できました。実際にはアプリケーションで特定のキーによって管理されたデータを一回削除して再度データを入れ直す、というような処理を実装していました。データ構造は全く違いますが、問題の本質はこれと一緒になります。この状況で中で一体何が起こっているのか見ていきましょう。基本まずここに上げる公式マニュアルを合わせてくまなく目を通しましょう。合わせてよくまとまっているサイトなどもあると思うので、嘘か本当か見極めつつ検索して参考にしましょう。本記事では各種ロックがどういうものかという基本的なことは一切説明しません。ステートメントで設定されたロックさらに言葉の定義をちゃんとイメージできた方がいいと思うのでいくつかここで補足します。トランザクションとロック「ロックした」とかいう表現が意外と通じるのであるのであたかも「ロック」というのが動作とか状態のように解釈されがちだと感じますが、自分なりに解釈した結果ですと「ロック」とはアクセスする権利とイメージするとしっくり来ると思います。あるトランザクションのsql実行が別のトランザクションによって待ち状態になったとしましょう。この時まさに「ロックした」といってもいいんですが、もっと正確に言うと「ロックを取得しようとしたが取得できずに待ち状態になった」というのが正しいです。ロックというのは単なるアクセス権なのです。ものすごく単純にいうと、この辺の話はトランザクションという登場人物がいて、レコードを操作する際にロック(アクセス権)を確保したり開放したりして自分の作業の影響範囲を定義しているのです。ロックが先に取得されていたら、ロックが解放されるまで終わるまで待つ。ロックが開放されたら自分がロックを取得してレコードを操作する。シンプルにそれだけの話です。ロックとはでロックにも3つほど種類が存在します。マニュアルを読むとなるほどこれらの性質はなんとなくわかります。いうところがいまいちマニュアルだけだと分からない。いうわけでここが本記事の肝になります。調査というわけでじゃあ具体的にどういうことが起こっているの?という調査をします。