MySQL のロックについて(InnoDB)
なぜロックをするのか?
本来 ACID で保証されている分離性(Isolation)が、パフォーマンスを理由に妥協されているため
設定された分離レベルによって、どんなケースでロックが必要なのか、あるいは不必要なのかが決まる
ロックの仕方
共有ロック
本人も他人も、書き込み不可
本人のみ、読み込み可能
同じ対象に対して、複数人が共有ロックをかけられる
排他ロック
本人のみ、書き込み可能
本人のみ、読み込み可能
同じ対象に対して、1人のみが排他ロックをかけられる
(※ イメージしやすいように、本人などの表記をしているが、実際にはトランザクション単位でロックを獲得する)
ロックの種類
レコードに対してのロック
テーブルに対してのロック
レコードとレコードの間(ギャップ)をロックすることで、その空間に新しいレコードが挿入されることを防ぐ。
code:sql
SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
上記では、範囲内のギャップがロックされているため、他のトランザクションが c = 15 のレコードを挿入できなくなります。
レコードロックとギャップロックの両方を使ったロック
トランザクション内では何回 SELECT をしても結果が同一である必要がある。
1回目と2回目の途中で INSERT されたとしても、それが検索範囲内だとしても、結果は同一でなければならない。
もし2回目に途中で INSERT されたレコードが表示された場合、そのレコードをファントムレコードと呼ぶ
参考リンク