3つのロックアルゴリズム
レコード ロック: 単一行レコードのロック
ギャップ ロック: ギャップ ロック、範囲をロックしますが、レコード自体は含まれません
ネクスト キー ロック: ギャップ ロック + レコード ロック、範囲をロックし、レコード自体をロックします
レコードロック
- Record Lock は常にインデックス レコードをロックします。InnoDB ストレージ エンジン テーブルの作成時にインデックスが設定されていない場合、InnoDB ストレージ エンジンは暗黙的な主キーを使用してロックします。
ネクストキーロック
- Next-Key Lock は、Gap Lock と Record Lock を組み合わせたロック アルゴリズムです。Next-Key Lock アルゴリズムでは、InnoDB は行クエリにこのロック アルゴリズムを使用します。たとえば、インデックスに 10、11、13、および 20 の 4 つの値がある場合、インデックスが Next-Key Locked にできる範囲は次のとおりです。 ただし、クエリされたインデックスに一意の属性が含まれている場合、InnoDB ストレージ エンジン
はNext-Key Lock Optimization を実行し、それを Record Lock にダウングレードします。つまり、範囲ではなくインデックス自体のみをロックします。
以下の例を見てください。まず、次のコードに従ってテスト テーブル t を作成します。
CREATE TABLE t a INT PRIMARY KEY
INSERT INTO t SELECT 1
INSERT INTO SELECT 2
INSERT INTO t SELECT 5
テーブル t には 1、2、5 の 3 つの値があります。上記の例では、最初にセッション A の a=5 に対して X ロックが実行されます。a は主キーであり一意であるため、範囲 (2,5) ではなく値 5 のみがロックされるため、セッション B に値 4 をブロックせずに挿入すると、すぐに挿入して返すことができます。つまり、ロックは Next-Key Lock アルゴリズムによってダウングレードされ、アプリケーションの同時実行性が向上します。