忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【データベースの知識】MVCCとロックの関係


データベースの並行性を高める技術「MVCC(Multi-Version Concurrency Control)」。これによって「読み取りと書き込みがブロックされない」仕組みが実現されていますが、すべてのロックが不要になるわけではありません。

1. 更新時の動作とロックの役割

【 基本 】 MVCC環境下でも、データの更新(UPDATE/DELETE)時には「排他ロック」を取得します。これは、複数のトランザクションが同時に同じ行を書き換えてしまう「ロストアップデート」を防ぐためです。

[ 更新のポイント ]
更新時のロック:対象行に対して排他ロックを取得します。原則として「行レベル」でロックされます。
更新 vs 更新:同じ行を更新しようとすると、先行する処理が終わるまで「ロック待ち」が発生します。
必ず行ロックか?:通常は行単位ですが、大量の行を一度に更新する場合やインデックス再構築時には、効率化のため「テーブルロック」へ格上げ(エスカレーション)されることがあります。

2. 「読取り」と「書込み」の関係

【 基本 】 MVCCの最大のメリットは、読み取り(SELECT)がロックを取得しないことです。書き込み中であっても、読み取り側は「その処理が始まる前の古いバージョン(多版)」を参照するため、互いに待ち時間が発生しません。

[ ロックの競合 ]
更新 vs 読み込み:ロック待ちなし(読取り側は古い版を見る)。
読み込み vs 更新:ロック待ちなし。
参照一貫性:スナップショットを見ることで、長時間実行される検索も一貫性が保たれます。

3. まとめ:MVCCとロックの整理

質問の答えを整理すると、以下のようになります。この仕組みにより、高いスループットが実現されています。

[ Q&A 形式での整理 ]
1. 更新の際にロックは取得するか?
→ はい。整合性を守るために必須です。原則として「行ロック」がかかります。
2. 更新と読み込みでロック待ちはあるか?
→ いいえ。MVCCにより、読み取りはロックを無視して実行可能です。
3. 更新と更新でロック待ちは発生するか?
→ はい。同一データへの同時書き込みは、必ず順番待ちが発生します。


基本は「行ロック」ですが、処理の規模によっては「テーブルロック」になる可能性も意識しておくと、より深いデータベース設計が可能になります。


PR