SELECT ... FROM ...
:
読み取り一貫性。データベースのスナップショットを読み取り、ロックを設定しない。
SELECT ... FROM ... LOCK IN SHARE MODE
:
読み取りで検出されたすべてのインデックスレコードに共有ネクストキーロックを設定する。
SELECT ... FROM ... FOR UPDATE
:
読み取りで検出されたすべてのインデックスレコードに排他ネクストキーロックを設定する。
INSERT INTO ... VALUES (...)
:
挿入されたレコードに排他ロックを設定する。このロックはネクストキーロックではないため、挿入されたレコードの前のギャップに他のユーザがレコードを挿入する可能性がある。重複キーエラーが発生した場合は、重複するインデックスレコードに共有ロックを設定する。
INSERT INTO T SELECT ... FROM S WHERE
...
: T
に挿入された各レコードに排他(非ネクストキー)ロックを設定する。読み取り一貫性として
S
を検索するが、MySQL
ログがオンになっている場合は、S
に共有ネクストキーロックを設定する。後者の場合に
InnoDB
がロックを設定する理由は、バックアップからのロールフォワードリカバリで、すべての
SQL
ステートメントを元の操作とまったく同じように実行する必要があるためである。
CREATE TABLE ... SELECT ...
:
前の項目と同様に、SELECT
を一貫性のある読み取りとして、または共有ロックを設定して実行する。
REPLACE
は、ユニークキーで衝突がなければ、挿入と同じように実行される。衝突がある場合は、更新対象のレコードに排他ネクストキーロックが設定される。
UPDATE ... SET ... WHERE ...
:
検索で検出されたすべてのレコードに排他ネクストキーロックを設定する。
DELETE FROM ... WHERE ...
:
検索で検出されたすべてのレコードに排他ネクストキーロックを設定する。
テーブルに FOREIGN KEY
制約が定義されている場合は、制約条件のチェックを必要とするすべての挿入、更新、削除によって、制約チェックのために参照するレコードに共有行レベルのロックが設定される。また、制約が失敗した場合も、InnoDB
によってこれらのロックが設定される。
LOCK TABLES ...
:
テーブルロックを設定する。これらのロックは、実装時に
MySQL
のコードレイヤによって設定される。InnoDB
の自動デッドロック検出では、このようなテーブルロックが関係するデッドロックを検出できない。
詳細については次のセクションを参照。
また、MySQL
は行レベルのロックを認識しないため、別のユーザが行レベルロックを設定しているテーブル上でテーブルロックを取得することができる。ただし、それによってトランザクションの完全性が損なわれるおそれがある。
See 項7.5.15. 「InnoDB テーブルの制限事項」。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.