データベーススペシャリスト試験 2019年 午前2 問18
DBMSの多版同時実行制御(MVCC)に関する記述として, 適切なものはどれか。
ア:同時実行される二つのトランザクションのうち, 先発のトランザクションがデータを更新し, コミットする前に, 後発のトランザクションが同じデータを参照すると, 更新前の値を返す。(正解)
イ:トランザクションがデータを更新する前に専有ロックを, 参照する前に共有ロックを掛け, コミットかロールバック後に全てアンロックする。
ウ:トランザクションがデータを更新する前に専有ロックを, 参照する前に共有ロックを掛け, 専有ロックはコミットかロールバック後までアンロックしないが, 共有ロックは不必要になったらアンロックする。
エ:トランザクションがデータを更新する前にロックを掛けず, コミット直前に他のトランザクションがそのデータを更新したかどうか確認し, 更新していないときだけコミットする。
解説
DBMSの多版同時実行制御(MVCC)に関する記述【午前2 解説】
要点まとめ
- 結論:MVCCでは、先に開始したトランザクションの更新がコミットされる前に後発トランザクションが同じデータを参照すると、更新前の値を返す。
- 根拠:MVCCは複数のバージョンを保持し、読み取り一貫性を確保するために過去のデータ状態を参照可能にする仕組みである。
- 差がつくポイント:ロックベース制御と異なり、MVCCは読み取り時にロックを掛けずに過去のバージョンを返すため、読み取りの待ちが発生しにくい点を理解すること。
正解の理由
アはMVCCの基本動作を正確に表しています。MVCCでは、トランザクションが更新をコミットするまでは、その変更は他のトランザクションから見えません。後発トランザクションはコミット前の更新を参照せず、更新前の値(旧バージョン)を読み取るため、読み取り一貫性が保たれます。
よくある誤解
MVCCはロックを使わないわけではなく、更新時には排他制御が必要です。また、読み取り時にロックを掛ける共有ロック方式とは異なるため混同しやすいです。
解法ステップ
- MVCCの特徴を確認する(複数バージョンの管理、読み取り一貫性)。
- 選択肢の記述がMVCCの動作に合致しているかを検証する。
- ロックベース制御(専有ロック・共有ロック)に関する記述はMVCCの説明として不適切と判断する。
- コミット前の更新が他トランザクションに見えない点を説明している選択肢を選ぶ。
選択肢別の誤答解説ステップ
- ア:正解。MVCCの基本動作を正しく説明している。
- イ:ロックベース制御の説明であり、MVCCの特徴とは異なる。
- ウ:共有ロックの早期解除を含むロックベース制御の説明で、MVCCの説明として誤り。
- エ:楽観的制御の一種であり、MVCCの説明ではない。
補足コラム
MVCCは読み取りトランザクションがロックを待つことなく過去のデータバージョンを参照できるため、読み取り性能が向上します。代表的なDBMSではPostgreSQLやOracleがMVCCを採用しています。一方、ロックベース制御は更新競合時に待ちが発生しやすい特徴があります。
FAQ
Q: MVCCはすべてのDBMSで採用されていますか?
A: いいえ。MVCCは多くのモダンDBMSで採用されていますが、ロックベース制御を使うDBMSも存在します。
A: いいえ。MVCCは多くのモダンDBMSで採用されていますが、ロックベース制御を使うDBMSも存在します。
Q: MVCCで読み取りトランザクションはロックを掛けますか?
A: いいえ。MVCCでは読み取り時にロックを掛けず、過去のバージョンを参照するため待ちが発生しません。
A: いいえ。MVCCでは読み取り時にロックを掛けず、過去のバージョンを参照するため待ちが発生しません。
関連キーワード: MVCC, 多版同時実行制御, トランザクション制御, ロック制御, 読み取り一貫性, 排他制御, 楽観的制御