この記事では、MySQL の挿入意図ロックについて説明し、挿入意図ロックとは何なのかを紹介します。インテント ロックを挿入する必要があるのはなぜですか?お役に立てれば幸いです!
挿入意図ロック、中国語では挿入意図ロックとも呼ばれます。
これは、以前に説明したギャップ ロックの補足と考えることができます。ギャップ ロックについて、まだ理解できない場合は、レコード ロック、ギャップ ロック、および次を参照してください。キーロック。
以前にもギャップ ロックがありましたが、ギャップ ロックはファントム リードの問題をある程度解決するのに役立ちます。しかし、以前にはいくつかの問題があるようです。
次のテーブルがあるとします:
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `age` (`age`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
id は自動インクリメントされる主キー、age は通常のインデックスです。テーブルには次のデータがあります:
次の挿入 SQL を実行するとします。
begin;insert into user(username,age) values('wangwu',95);
この SQL は実行されますが、トランザクションはまだコミットされていないことに注意してください。
Gap Lock について以前に学んだ知識によれば、この時点での Gap Lock の範囲は (89,99) であり、この範囲の年齢は挿入できないことを意味します。
この場合、データ挿入の効率が悪く、ロック競合が発生しやすくなります。
今日紹介する挿入意図ロックは、この問題を解決するために使用されます。
MySQL 公式 Web サイトの概要を見てみましょう:
An挿入意図ロックは、行挿入の前に INSERT 操作によって設定されるギャップ ロックの一種です。このロックは、同じインデックス ギャップに挿入する複数のトランザクションが、次の時点で挿入していない場合に相互に待機する必要がないように、挿入の意図を示します。ギャップ内の同じ位置。値 4 と 7 を持つインデックス レコードがあるとします。値 5 と 6 をそれぞれ挿入しようとする別のトランザクションは、それぞれ挿入意図ロックを使用して 4 と 7 の間のギャップをロックします。挿入された行の排他ロックを取得する前に、行が競合していないため相互にブロックしないでください。
大まかな翻訳は次のとおりです:
挿入意図のロックは、 INSERT 操作の前に設定されたギャップ ロック、挿入の意図 ロックは挿入の意図を表します。つまり、複数の異なるトランザクションが同じインデックスの同じギャップに同時にデータを挿入する場合、相互に待機する必要はありません。 、ブロックされません (前述のギャップ ロックの理論に従って、次のトランザクションが同じギャップにデータを挿入できるようになる前に、ギャップ ロックが解放されるのを待つ必要があるという単純に従っている場合)。値 4 と 7 のインデックス レコードがあるとします。現在、2 つのトランザクションがそれぞれ値 5 と 6 のレコードを挿入しようとしています。各トランザクションは、排他ロックを取得する前に、挿入インテント ロックを使用して 4 と 7 の間をロックします。挿入された行にはギャップがありますが、行は競合しないため、2 つのトランザクションは互いにブロックされません。
これは、インテンション ロックを挿入するためのものです。
友人の皆さん、ソング兄弟が以前みんなとギャップ ロックについて話し、これが REPEATABLE READ の分離レベルであると言ったことに注意してください。したがって、Insert Intention Lock は特殊なギャップ ロックになり、もちろん反復読み取りの分離レベルでも有効になります。
次に、2 つの単純なケースを通じてインテンション ロックの挿入を示します。
テーブル構造とデータは最初のセクションと一致しています。
まず、セッション A で次のコードを実行します。
これで、セッション A のトランザクションはコミットされません。
次に、セッション B で挿入操作も実行します。
セッション B もブロックせずに通常どおり実行できることがわかりました。
これは、2 つの挿入意図ロックに互換性があり、共存できることを示しています。
互換性のない別の例を見てみましょう。
まず、セッション A で次の SQL を実行して、80 を超えるレコードをクエリし、排他ロックを追加します。
次にセッション B で、次の SQL を実行します。次のコードはデータ行を挿入します:
皆さん、この操作はブロックされることがわかります。ブロックする理由は、挿入意図ロックと排他ロックが相互に排他的であるためです。
ブロッキング状況を利用して、セッション C で、前の記事で使用した show Engine innodb status\G
コマンドを使用して、ロック状況を確認します。 :
出力内容において、赤枠が選択されている箇所は、挿入意図ロックの存在を明示しています。
要約すると:
インテンション ロックの挿入名前にはインテンションという言葉が付いていますが、実際には特殊なギャップロックです。
挿入意図のロックは相互に排他的ではありません。
意図ロックと排他ロックの間に相互排他を挿入します。
質問がありましたら、ディスカッションのためにメッセージを残してください。
[関連する推奨事項: mysql ビデオ チュートリアル ]
以上がMySQLにおける挿入意図ロックについて語る記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。