1. ロックの分類
1. アイデアに応じて分割する
- オプティミスティック ロック
は常にオプティミスティックです。オプティミスティック ロックでは、通常の状況ではデータが競合を引き起こすことはないと考えられるため、データの競合は、データが更新のために送信されたときにのみ検出されます。アナログCAS - 悲観的ロックは
常に悲観的であり、データ処理プロセス全体の間、データはロックされます。アナログ同期
2.粒度で分ける
- 行ロック
- ページロック
- テーブルロック
3. タイプ別に分ける
- 共有ロック(読み取りロック)
- 排他ロック(書き込みロック)
2.マイサム
1. ロック機能
MyISAM はテーブル ロックを使用します。MyISAM がクエリおよび更新操作を実行すると、関係するすべてのテーブルに読み取りロックまたは書き込みロックが追加されます。
2. 同時挿入
1. MyISAM同時挿入公式説明書
2. 解説
- MyISAM ストレージ エンジンは、読み取りロックと書き込みロックの間の競合を減らすために同時挿入をサポートしています。
- テーブル データ ファイル間に穴がない(つまり、途中で削除されたデータがない)場合は、 SELECTステートメントの実行中にINSERTステートメントを実行して、テーブルの末尾にデータ行を追加できます(つまり、同時挿入)
- 複数のINSERTステートメントがある場合、 SELECTステートメントの実行中に、それらのステートメントはキューに入れられ、順番に実行されます。同時挿入の結果はすぐには表示されない場合があります。
3. concurrent_insertシステム変数
- デフォルトはAUTO (または 1) で、ホールなしの同時挿入をサポートします。
- NEVER (または 0)、同時挿入を無効にします
- ALWAYS (または 2)、ホールのあるテーブルでもテーブルの最後での同時挿入を許可します。
4. MyISAMロックのスケジュール設定
テーブル レベルのロックのみを使用するストレージ エンジン( MyISAM、MEMORY、MERGEなど)の場合、書き込みプロセスの優先順位は読み取りプロセスの優先順位よりも高くなります。読み取りプロセスはキューの先頭にありますが、書き込みプロセスはキューの先頭にあります。プロセスもキューにジャンプします。
- システム変数low-priority-updates =1 を設定すると、すべてのINSERT、UPDATE、DELETE、およびLOCK TABLE WRITEステートメントは、影響を受けるテーブルで保留中のSELECTまたはLOCK TABLE読み取り操作がなくなるまで待機します。
- INSERT、UPDATE、および DELETEステートメントのLOW_PRIORITY属性を指定して、ステートメントの優先順位を下げます。
3. InnoDB
InnoDB は行ロックとテーブル ロックをサポートします
1. ロックの種類による分類
- 共有 (S) ロックと排他的 (X) ロック
トランザクションT1は行 rの共有ロックを保持します。このとき、行 rのロックに対する別のトランザクションT2の要求は次のように処理されます。
- トランザクションT2によって要求された行 rのSロックはすぐに付与できるため、T1とT2の両方が行 rのSロックを取得します。
- トランザクションT2 の行 rに対するXロックの要求は、すぐには許可されません。
トランザクションT1 が行rに対して排他 (X) ロックを保持している場合、別のトランザクションT2からのリクエストは、行 rに対していかなる種類のロックも直ちに付与することはできません。 この時点で、トランザクションT2 は、トランザクションT1 が行 rのX ロックを解放するまで待つ必要があります。
つまり、読み取りと読み取りの互換性があり、読み取りと書き込みは相互に排他的です。
- インテンションロック
InnoDB は複数粒度のロックをサポートしており、行ロックとテーブル ロックの共存が可能です。
複数の粒度レベルでロックを実装するために、InnoDB はインテント ロックを使用します。インテンション ロックは、トランザクションが後でテーブル内の行に対してどのタイプのロック (共有または排他)を使用する必要があるかを示すテーブル レベルのロックです。
- インテント共有 (IS) ロックは、
トランザクションがテーブル内の単一行に共有ロックを設定することを意図していることを示します。 - インテント排他 (IX) ロックは
、トランザクションがテーブル内の単一行に排他ロックを設定することを意図していることを示します。
ロックの互換性は次のとおりです。
バツ | IX | S | は | |
---|---|---|---|---|
バツ | N | N | N | N |
IX | N | Y | N | Y |
S | N | N | Y | Y |
は | N | Y | Y | Y |
- レコード ロック
行ロックは、次の SQL を実行するときにインデックスレコードをロックします。
SELECT id FROM student WHERE id = 1;
id=1 のインデックスは、他のトランザクションによる挿入、更新、削除を防ぐためにロックされます。
- ギャップロック
ギャップ ロックは、インデックス レコード間のギャップ、または最初のインデックス レコードの前または最後のインデックス レコードの後のギャップに対するロックです。
例えば、
SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 For UPDATE;
他のトランザクションが値 15 を列 t.c1 に挿入する場合、現在の範囲 (10 ~ 20) のギャップがロックされているため、これは許可されません。
ユニークインデックスを使用して検索する場合はギャップロックは発生しませんが、ジョイントインデックスを使用して検索する場合はギャップロックが発生します。
例えば:
SELECT * FROM child WHERE id = 100;
- id 列が唯一のインデックスである場合、上記のステートメントは id=100 の行に対してのみ行ロックを使用し、ギャップ ロックは生成されません。
- id 列にインデックスが作成されていない場合、またはセカンダリ インデックスがある場合、このステートメントは前のギャップをロックします。
READ COMMITED 分離レベルでは、ギャップ ロックは明示的に無効になります。
- ネクストキーロック
Next-Key ロックは、レコード ロックとギャップ ロックを組み合わせたものです
例: トランザクションT1 が行 rに共有ロックまたは排他ロックを追加すると、行 rの前のギャップにギャップ ロックも追加されます。このとき、別のトランザクションT2は行rの前に新しいインデックス レコードを挿入できません。
インデックスに値 10、11、13、20 が含まれているとします。このインデックスに対して可能なNext-Keyロックは、次の範囲をカバーします。
(-∞, 10]
(10, 11]
(11, 13]
(13, 20]
(20, +∞))
最後のギャップについては、Next-Key Locks がインデックスの最大値を超えるギャップをロックし、「正の無限大」 " "ダミー レコード。この疑似レコードの値は、インデックス内の実際の値よりも高くなります。これは実際のインデックス レコードではないため、実際には、このネクスト キー ロックは最大インデックス値の後のギャップのみをロックし ます。
デフォルトでは、InnoDB はREPEATABLE READ トランザクション分離レベルで動作します。この場合、InnoDB は検索とインデックス スキャンに Next-Key Locks を使用し、ファントム読み取りを防ぎます。