重要
⏱ 8分★★★★☆
同時実行制御
2PL・MVCC・楽観的ロック・直列化可能性を完全習得
同時実行制御の目的
複数のトランザクションが同時に実行される環境で、データの整合性を保ちながら高スループットを実現するための制御技術。適切な制御がないと読み取り異常・更新異常が発生する。
読み取り異常の種類(再確認)
| 異常 | 発生条件 | 説明 |
| ダーティリード | READ UNCOMMITTED | コミット前データを読む。後でロールバックされると不整合 |
| ノンリピータブルリード | READ COMMITTED以下 | 同一トランザクション内で同じ行を2回読むと値が変わる |
| ファントムリード | REPEATABLE READ以下 | 同一範囲検索で行数が変わる(挿入・削除による) |
| 更新の喪失 | 同時更新時 | 2つのTXが同じ行を読んで更新すると一方の変更が消える |
同時実行制御の主要手法
| 手法 | 概要 | 特徴 |
| 2相ロック(2PL) | ロック獲得フェーズと解放フェーズを分離 | 直列化可能性を保証。デッドロックあり |
| MVCC(多版同時実行制御) | 更新前のスナップショットを残し古い版を参照させる | 読み取りがブロックされない。PostgreSQL/MySQL採用 |
| 楽観的ロック | コミット時にバージョン番号で競合チェック | 競合が少ない場合に効率的 |
| タイムスタンプ順序 | TXのタイムスタンプで操作順序を決定 | デッドロックなし。古いTXをアボートする可能性 |
MVCC(多版同時実行制御)の仕組み
更新時に古いバージョンを保持し、同時実行するトランザクションに適切なバージョンを見せる。
TX1 が行を更新 → 新バージョンを作成し、古いバージョンを保持
↓
TX2 が同じ行を読む → TX2 の開始時点のスナップショット(古いバージョン)を返す
↓
TX1 がコミット → 新バージョンが確定。TX2 はコミット後に新バージョンを参照可能
↓
古いバージョンは全TXから不要になった時点でバキューム(削除)
MVCC の最大メリット:「読み取りが書き込みをブロックしない、書き込みが読み取りをブロックしない」。高い同時実行性を実現。
スケジューラビリティ(直列化可能性)
複数TXの同時実行が何らかの直列実行と等価な結果を生み出すとき、そのスケジュールは直列化可能(serializable)と呼ぶ。
- 競合直列化可能性:競合する操作(同じデータへの読み書き競合)を解析
- 2PL を正しく実装すると直列化可能性が保証される
- SERIALIZABLE 分離レベルがこれを保証する最高レベル
試験頻出ポイント
- 4種の読み取り異常と防止する分離レベルの対応を暗記
- MVCC:読み取りが書き込みをブロックしない → 高並列性
- 2PL:ロック獲得フェーズと解放フェーズを分離することで直列化保証
- 楽観的ロック:バージョン番号で競合チェック → 競合少ない場合に有効
- 直列化可能性 = 何らかの直列実行と等価な結果になること
📝 理解度チェック
MVCC(多版同時実行制御)の最大のメリットはどれか?
2相ロック(2PL)の「2相」とは何の2段階か?
「更新の喪失(Lost Update)」はどのような状況で発生するか?
読了ボタンを누すとトップページの進捉に反柼されます