「存在しない行を更新するために...を選択する」ときのロックに興味があります。現在、テーブル「test02」のデータは次のとおりです。
ID
1
3
8
15
20
列 ID は主キーです。
私が実行するとき:
session1: トランザクションを開始します。select * from test02 where id = 7 for update;
次に、別のセッションを開き、フェローとして実行します。
session2: トランザクションを開始します。select * from test02 where id = 7 for update;
予想通り、session2 はギャップ ロック (3, 8) を待機します。ただし、2 つのセッションは正常に実行されます。session2 が待機しない理由を説明できる人はいますか?
しかし、セッション 3 で次の SQL を実行すると、test02(id) 値 (7) に挿入されます。セッションがブロックされている場合、セッション 1 のギャップ ロックが使用されていることを意味します。しかし、session2が正常に実行できる理由がわかりません。
mysql バージョン 5.7 と 5.8 はどちらも同じ結果を示します。