ロック・排他制御 - RDB(MySQL)

最終更新日: 2026-08-25

TOP(About this memo)) > 一覧(RDB) > ロック・排他制御(MySQL)

ロック・排他制御(MySQL)

一貫性読み取り(consistent-read)

分離レベル

ロックの種類

MySQLの特徴として、ギャップロック、ネクストキーロックがある。

ロック取得状況を確認する

select * from performance_schema.data_locks;

LOCK_MODE:

LOCK_DATA: LOCK_TYPE='RECORD' の場合はロックされたレコードの主キー値、それ以外の場合はNULL。

ロックしているトランザクションを特定してkillする:

SELECT trx_rows_locked FROM information_schema.INNODB_TRX;  -- スレッドIDなどがわかる
show processlist;
KILL 19784;

ロックの範囲

ギャップロックが発生する場合

SQLが空振りした際に取得される(?)。例えば BETWEEN 3 AND 6 で取得した際、テーブルに3, 5, 8しかない場合は6が空振りしているので、8までギャップロックが取られる。これはファントムリードを回避するためとされている。

(IME) 「仮に他の処理で8が挿入されても、次に BETWEEN 3 AND 6 を行ったときには関係ないのでは」と最初は疑問に思ったが、MySQLはインデックスを使ってロックをかけているため、このような挙動になるらしい(?)。

無効化したい場合は、トランザクション分離レベルをREAD COMMITTEDに変更する。

ギャップロックの目的は、REPEATABLE READでファントムリードを回避するため。ISO SQLの仕様では、REPEATABLE READにおいてファントムリードは許容されるが、InnoDBでは発生しないようになっている。これは、ギャップロックによって走査した範囲への挿入をロックすることで実現している。