### 【データベース】過去の写し鏡で一貫性を保つ!「スナップショット分離」|情報処理問題1000本ノック
データをロックして全員を待たせるのではなく、「処理を始めた瞬間のデータの写真(スナップショット)」を見せることで、超高速と高い整合性を両立する技術を攻略しましょう。
1. 【 問題 】:高度な同時実行制御
【 問題 】 トランザクションの同時実行制御において、各トランザクションが処理を開始した時点のデータベースの「スナップショット(一貫性のある過去のデータ状態)」を読み取ることで、他のトランザクションによる更新操作と衝突(ロックの競合)することなく、一貫した読み取りを可能にする分離レベルはどれでしょうか?
① Read Uncommitted
② スナップショット分離(Snapshot Isolation)
③ Read Committed
④ Serializable (厳格な悲観的ロック)
2. 正解:
正解: ② スナップショット分離(Snapshot Isolation)
3. 解説:「読者」と「筆者」が互いを邪魔しない
スナップショット分離は、MVCC(マルチバージョン同時実行制御)という技術を用いて実現されます。データを上書きするのではなく「古いバージョン」を残しておくことで、読み取り処理に過去のデータを提示します。
■ 読者は待たない、書く人も待たない
・誰かがデータを激しく更新していても、読み取り側は「自分が開始した時点のデータ」を読めばよいため、ロックによる順番待ちが発生しません。
■ 3大有害現象をすべて防止
・「ダーティリード」「ノンリピータブルリード」「ファントムリード」のすべてが発生しません(※実質的にRepeatable Read以上の堅牢性)。
■ ライトスキュー(Write Skew)という弱点
・非常に特殊なケースで、別々のデータを同時に更新し合うと、お互いのスナップショットが交差して矛盾(ライトスキュー)が起きる場合があります。
★ PostgreSQL や Oracle、SQL Server など、現代の主要なRDBMSの多くが、このスナップショット(またはそれに類するMVCCの仕組み)をベースにして、高速かつ安全な並行処理を実現しています。
1. 理解のコツ: 共有ドキュメントをみんなで編集している時、あなたが「印刷(読み取り)」ボタンを押した瞬間の状態がそのまま印刷されるイメージです。印刷中に他の人が内容を書き換えても、あなたの手元の紙(スナップショット)は変わりません。
2. 試験対策の視点: 「開始した時点の」「ロックを伴わない一貫した読み取り」「MVCC」といったキーワードが出たらスナップショット分離です。データベースの性能を落とさずに整合性を保つための超重要技術として出題されます。
4. まとめ
「トランザクション開始時のデータ写真を見せることで、ロックなしで整合性を保つ仕組み」。これがスナップショット分離です。現代の高アクセスなWebシステムを支える、データベースエンジニア必須の教養です。