InnoDBは、特定の種類のロックを次のように設定します。
-
SELECT ... FROMは一貫性のある読み取りであり、データベースのスナップショットを読み取り、トランザクション分離レベルがSERIALIZABLEに設定されていない限り、ロックを設定しません。 SERIALIZABLEレベルの場合、検索は、検出したインデックスレコードに共有の次のキーロックを設定します。
-
SELECT ... FROM ... LOCK IN SHARE MODEは、検索で検出されたすべてのインデックスレコードに共有ネクストキーロックを設定します。
-
検索で検出されたインデックスレコードの場合、SELECT ... FROM ... FOR UPDATEは、他のセッションがSELECT ... FROM ... LOCK IN SHARE MODEを実行したり、特定のトランザクション分離レベルを読み取ったりするのをブロックします。一貫性のある読み取りでは、読み取りビューに存在するレコードに設定されているロックはすべて無視されます。
-
UPDATE ... WHERE ...は、検索で検出されたすべてのレコードに排他的な次のキーロックを設定します。
-
DELETE FROM ... WHERE ...は、検索で検出されたすべてのレコードに排他的な次のキーのロックを設定します。
-
INSERTは、挿入された行に排他ロックを設定します。このロックはインデックスレコードロックであり、次のキーロックではありません(つまり、ギャップロックはありません)。また、挿入された行の前に他のセッションがギャップに挿入されるのを防ぎません。
InnoDBには、いくつかの種類のレコードレベルのロックがあります。
-
レコードロック:これはインデックスレコードのロックです。
-
ギャップロック:これは、インデックスレコード間のギャップのロック、または最初または最後のインデックスレコードの前または後のギャップのロックです。
-
次のキーロック:これは、インデックスレコードのレコードロックと、インデックスレコードの前のギャップのギャップロックの組み合わせです。
もっと見る:
Next-KeyLockingを使用したファントム問題の回避