0

「存在しない行を更新するために...を選択する」ときのロックに興味があります。現在、テーブル「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 はどちらも同じ結果を示します。

4

1 に答える 1