MySQL InnoDB ロックの概要

MySQL InnoDB ロックの概要

1. 共有ロックと排他ロック

共有ロック

排他ロック

InnoDB は、共有ロックと排他ロックの 2 種類のロックを含む標準の行レベル ロックを実装します。

共有 (S) ロックは、ロックを保持しているトランザクションが行を読み取ることを許可します。

排他 (X) ロックは、ロックを保持するトランザクションが行を更新または削除することを許可します。

共有ロックにより、ロックを保持しているトランザクションは行を読み取ることができます。

排他ロックにより、ロックを保持しているトランザクションは行を更新または削除できるようになります。

トランザクション T1 が行 r に対して共有ロック (S) を保持している場合、別のトランザクション T2 からの要求は次のように処理されます。

  • T2 の S ロック要求は直ちに許可されます。その結果、T1 と T2 の両方が行 r に対して S ロックを保持します。
  • T2 の X ロック要求はすぐには許可されません。

トランザクション T1 が行 r に対して排他ロック (X) を保持している場合、別のトランザクション T2 からの要求に対して、r に対するどちらのタイプのロックもすぐに付与することはできません。代わりに、トランザクション T2 は、トランザクション T1 が行 r のロックを解除するまで待機する必要があります。

2. 意図ロック

意図ロック

InnoDB はマルチ粒度ロックをサポートしており、行ロックとテーブルロックの共存が可能です。 たとえば、LOCK TABLES ... WRITE などのステートメントは、指定されたテーブルに対して排他ロック (X ロック) を取得します。複数の粒度レベルでロックを実装するために、InnoDB はインテンション ロックを使用します。インテンション ロックは、テーブル レベルのロックであり、トランザクションに対して、後でテーブル内の行に使用する必要があるロックの種類 (共有または排他) を示します。

インテンションロックには 2 つの種類があります。

  • 意図的共有ロック (IS) は、トランザクションがテーブル内の単一行に共有ロックを設定することを意図していることを示します。
  • 意図的排他ロック (IX) は、トランザクションがテーブル内の 1 つの行に排他ロックを設定することを示します。

たとえば、SELECT ... LOCK IN SHARE MODE は IS ロックを設定し、SELECT ... FOR UPDATE は IX ロックを設定します。

意図ロックの合意は次のとおりです。

トランザクションがテーブル内の行に対して共有ロックを取得する前に、まずテーブルに対して IS ロックまたはより強力なロックを取得する必要があります。
トランザクションがテーブル内の行の排他ロックを取得する前に、まずそのテーブルで IX ロックを取得する必要があります。
テーブルレベルのロック タイプの互換性は次のとおりです。

要求元のトランザクションが既存のロックと互換性がある場合はロックが許可されますが、既存のロックと競合する場合はロックは許可されません。トランザクションは、競合する既存のロックが解除されるまで待機します。ロック要求が既存のロックと競合し、デッドロックが発生するため許可できない場合は、エラーが発生します。

意図ロックは、テーブル全体のリクエスト (LOCK TABLES ... WRITE など) 以外をブロックしません。意図的ロックの主な目的は、誰かがテーブル内の行をロックしている、またはロックしようとしていることを示すことです。

3. レコードロック

レコードロック

レコード ロックは、インデックス レコードに対するロックです。

レコード ロックは、インデックス レコードに対するロックです。たとえば、SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; は、t.c1 の値が 10 である行を他のトランザクションが挿入、更新、または削除することを防ぎます。

レコード ロックは、テーブルにインデックスが定義されていない場合でも、常にインデックス レコードをロックします。テーブルにインデックスがない場合、InnoDB は非表示のクラスター化インデックスを作成し、そのインデックスをレコードのロックに使用します。

4. ギャップロック

ギャップロック

ギャップ ロックは、インデックス レコード間のギャップに対するロック、または最初のインデックス レコードの前または最後のインデックス レコードの後のギャップに対するロックです。

ギャップ ロックは、インデックス レコード間のギャップに対するロック、または最初のインデックス レコードの前または最後のインデックス レコードの後のギャップに対するロックです。

たとえば、SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; は、範囲内のすべての既存の値間のギャップがロックされるため、列に既にそのような値があるかどうかに関係なく、他のトランザクションが t.c1 列に値 15 を挿入することを防ぎます。

ギャップは、単一のインデックス値、複数のインデックス値にまたがる場合があり、空になる場合もあります。

ギャップ ロックは、パフォーマンスと同時実行性のトレードオフの一部であり、一部のトランザクション分離レベルで使用されますが、他のレベルでは使用されません。

一意の行を検索するために一意のインデックスを使用して行をロックするステートメントの場合、ギャップ ロックは必要ありません。

たとえば、id 列に一意のインデックスがある場合、次のステートメントは、他のセッションが前のギャップに行を挿入するかどうかに関係なく、id 値が 100 の行に対してのみインデックス レコード ロックを取得します。

SELECT * FROM child WHERE id = 100;

id 列にインデックスがないか、一意でないインデックスがある場合、ステートメントは先頭のギャップをロックします。

ここで注目すべき点は、異なるトランザクションがギャップに対して競合するロックを保持する可能性があることです。

たとえば、トランザクション A はギャップに対して共有ギャップ ロック (ギャップ S ロック) を保持し、トランザクション B は同じギャップに対して排他ギャップ ロック (ギャップ X ロック) を保持できます。競合するギャップ ロックを許可する理由は、レコードがインデックスから削除された場合、異なるトランザクションによって保持されているレコードのギャップ ロックをマージする必要があるためです。

InnoDB におけるギャップ ロックの唯一の目的は、他のトランザクションがギャップに挿入されるのを防ぐことです。ギャップロックは共存できます。あるトランザクションによって取得されたギャップ ロックは、別のトランザクションが同じギャップに対してギャップ ロックを取得することを妨げるものではありません。共有間隔ロックと排他間隔ロックの間に区別はありません。それらは互いに競合せず、同じ機能を実行します。

5. ネクストキーロック

ネクストキー ロックは、インデックス レコードに対するレコード ロックと、インデックス レコードの前のギャップに対するギャップ ロックの組み合わせです。

ネクストキー ロックは、インデックス レコードのレコード ロックとインデックス レコードの前のギャップ ロックの組み合わせです。

InnoDB が行レベルのロックを行う方法は、テーブル インデックスを検索またはスキャンするときに、検出されたインデックス レコードに共有ロックまたは排他ロックを設定するというものです。したがって、行レベルのロックは実際にはインデックス レコード ロックです。インデックス レコードの次のキー ロックは、そのインデックス レコードの前の「ギャップ」にも影響します。つまり、次のキー ロックは、インデックス レコード ロックと、インデックス レコードの前のギャップ ロックを組み合わせたものになります。セッションがインデックス内のレコード R に対して共有ロックまたは排他ロックを持っている場合、別のセッションはインデックス順序で R の前のギャップに新しいインデックス レコードを挿入できません。

インデックスに値 10、11、13、20 が含まれているとします。このインデックスの可能な次のキー ロックは、次の範囲をカバーします。

(負の無限大、10]
(10、11]
(11、13)
(13、20)
(20、正の無限大)

デフォルトでは、InnoDB は REPEATABLE READ トランザクション分離レベルを使用します。この場合、InnoDB はファントム行を防ぐために、検索とインデックス スキャンに次のキー ロックを使用します。

6. 意図ロックを挿入する

意図ロックを挿入する

挿入意図ロックは、行が挿入される前に INSERT 操作によって設定されるギャップ ロックです。このロックは、複数のトランザクションが同じインデックス ギャップに挿入する場合、ギャップ内の同じ位置に挿入していない限り、トランザクションが互いに待機する必要がないことを意味します。値が4と7のインデックスレコードがあると仮定します。別々のトランザクションが値 5 と 6 を挿入しようとします。各トランザクションは、挿入された行の排他ロックを取得する前に、挿入意図ロックを使用して 4 と 7 の間のギャップをロックしますが、行は競合しないため、互いにブロックされません。

7. AUTO-INCロック

AUTO-INC ロックは、AUTO_INCREMENT 列を持つテーブルに挿入するトランザクションによって取得される特別なテーブル レベルのロックです。最も単純なケースでは、1 つのトランザクションがテーブルに値を挿入している場合、他のトランザクションは、最初のトランザクションによって挿入された行が連続した主キー値を受け取るように、そのテーブルへの独自の挿入を待機する必要があります。

ロックの適用

上記はMySQL InnoDBロックの詳細な概要です。MySQL InnoDBロックの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL InnoDB トランザクション ロック ソースコード分析
  • MySQL InnoDB のロック機構の詳細な説明
  • MySQL の InnoDB ストレージ エンジンのロックの基本的な使用方法のチュートリアル
  • MySQL の InnoDB のギャップロック問題
  • MySQL InnoDB のロック分類の紹介
  • MySQL InnoDB トランザクションとロックの詳細な説明
  • MySQLのInnoDBストレージエンジンにおけるさまざまなロックの詳細な説明

<<:  Webフロントエンド開発CSS関連チームコラボレーション

>>:  CSS コンテンツ属性を使用して、マウスホバープロンプト (ツールチップ) 効果を実現します。

推薦する

Tomcat のプレースホルダーによるポート設定方法 (パラメータ指定方式)

仕事で必要になったため、インターネットで多くの情報を見つけましたが、それらはすべてコピーアンドペース...

JSはマップを使用してdouble配列を統合します

目次序文データのシミュレーション結合されたデータ合併のアイデアコードの表示と分析最初のステップステッ...

Bootstrapグリッドの垂直および水平配置の詳細な説明

目次1. Bootstrap グリッドレイアウト2. 垂直方向の配置2.1 行タグの垂直方向の配置を...

HTML&CSS&JS 互換性ツリー (IE、Firefox、Chrome)

Web デザインにおけるツリーとは何ですか?簡単に言うと、リンクをクリックするとサブディレクトリが展...

IEのクラッシュバグ

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

Linux システム (Centos6.5 以上) のインストール JDK チュートリアル分析

記事の構成1. 準備2. Java JDK8.0をインストールする3. 環境変数を設定する3. イン...

Linux学習におけるmkdirコマンドの詳しい説明

目次序文1. ファイルの概念に関する基礎知識2. mkdir コマンド序文最近、Linux にますま...

CSSカスケーディングメカニズムについての簡単な説明

CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...

デザイン理論:フォントデザインの基礎

<br />言葉は、人間の思考や感情を伝えるために必然的に生み出されるものです。人類の文...

MySQLクエリが遅い場合の理由と解決策

Python プログラムを書き、Mysql ライブラリを集中的に操作したためです。データ量が多くない...

MYSQL 左結合の最適化 (10 秒から 20 ミリ秒)

目次【機能背景】 [生のSQL] 【独自SQL解析】 【分析手順】 [最適化されたSQL] 【最適化...

1つの記事でJSONPの原理と応用を理解する

目次JSONPとはJSONP 原則JSONP実装1. Ajaxでクロスドメインリクエストが行われると...

WeChatミニプログラムでEchartとサブパッケージを使用するための完全な手順

序文休日は終わっていますが、それは別の形で(お腹に触れることで)私たちに現れます。ミニプログラムでデ...

Reactは複雑な検索フォームの展開と折りたたみ機能を実装します

時間に余裕を持って、過去を忘れましょう。前のセクションでは、[検索] フォームとクエリおよびリセット...

この記事では、CSSのようなJSモジュールをインポートする方法を説明します。

目次序文構築可能なスタイルシートとは何ですか? CSSモジュールスクリプトの使用インポートアサーショ...