【データベースの知識】MVCCとロックの関係
データベースの並行性を高める技術「MVCC(Multi-Version Concurrency Control)」。これによって「読み取りと書き込みがブロックされない」仕組みが実現されていますが、すべてのロックが不要になるわけではありません。
1. 更新時の動作とロックの役割
【 基本 】 MVCC環境下でも、データの更新(UPDATE/DELETE)時には「排他ロック」を取得します。これは、複数のトランザクションが同時に同じ行を書き換えてしまう「ロストアップデート」を防ぐためです。
★ 更新時のロック:対象行に対して排他ロックを取得します。原則として「行レベル」でロックされます。
★ 更新 vs 更新:同じ行を更新しようとすると、先行する処理が終わるまで「ロック待ち」が発生します。
★ 必ず行ロックか?:通常は行単位ですが、大量の行を一度に更新する場合やインデックス再構築時には、効率化のため「テーブルロック」へ格上げ(エスカレーション)されることがあります。
2. 「読取り」と「書込み」の関係
【 基本 】 MVCCの最大のメリットは、読み取り(SELECT)がロックを取得しないことです。書き込み中であっても、読み取り側は「その処理が始まる前の古いバージョン(多版)」を参照するため、互いに待ち時間が発生しません。
★ 更新 vs 読み込み:ロック待ちなし(読取り側は古い版を見る)。
★ 読み込み vs 更新:ロック待ちなし。
★ 参照一貫性:スナップショットを見ることで、長時間実行される検索も一貫性が保たれます。
3. まとめ:MVCCとロックの整理
質問の答えを整理すると、以下のようになります。この仕組みにより、高いスループットが実現されています。
1. 更新の際にロックは取得するか?
→ はい。整合性を守るために必須です。原則として「行ロック」がかかります。
2. 更新と読み込みでロック待ちはあるか?
→ いいえ。MVCCにより、読み取りはロックを無視して実行可能です。
3. 更新と更新でロック待ちは発生するか?
→ はい。同一データへの同時書き込みは、必ず順番待ちが発生します。
基本は「行ロック」ですが、処理の規模によっては「テーブルロック」になる可能性も意識しておくと、より深いデータベース設計が可能になります。