トランザクションの隔離性水準に関する問題【午前2 解説】
要点まとめ
- 結論:ダーティリードを回避しつつ、同一トランザクション内での複数回読み込み値の一貫性は保証しないのは「READ COMMITTED」です。
- 根拠:READ COMMITTEDはコミット済みデータのみを読み込み、未コミットの変更は見えないためダーティリードを防止しますが、再読込み時に他トランザクションの更新が反映されるため値の一貫性は保証しません。
- 差がつくポイント:ダーティリードの有無と、同一トランザクション内での複数回読み込みの値の変化を理解し、隔離レベルの特徴を正確に区別できることが重要です。
正解の理由
選択肢アの「READ COMMITTED」は、トランザクションがコミットしたデータのみを読み込むため、ダーティリード(未コミットデータの読み込み)を防止します。一方で、同一トランザクション内で同じ行を複数回読み込んだ場合、他のトランザクションがコミットした更新が反映されるため、1回目と2回目以降の読み込み値が異なる可能性があります。これが問題文の(1)(2)の条件に合致します。
よくある誤解
READ COMMITTEDは「読み込みの一貫性が完全に保証される」と誤解されがちですが、実際には再読込み時に値が変わることがあります。これが「不可視な更新」や「ノンリピータブルリード」と呼ばれる現象です。
解法ステップ
- トランザクションの隔離レベルの基本的な特徴を確認する。
- ダーティリードを防止するレベルを特定する(READ UNCOMMITTEDは防止しない)。
- 同一トランザクション内での複数回読み込みの値の一貫性を確認する。
- 問題文の条件に合致する隔離レベルを選択肢から選ぶ。
選択肢別の誤答解説
- ア: READ COMMITTED
ダーティリードを防止しつつ、再読込み時に値が変わる可能性があるため正解。
- イ: REPEATABLE READ
同一トランザクション内での複数回読み込み値が変わらないため、(2)の条件に合わない。
- ウ: READ UNCOMMITTED
未コミットデータも読み込むためダーティリードを防止できず、(1)に合わない。
- エ: SERIALIZABLE
最も高い隔離レベルで、ダーティリードもノンリピータブルリードも防止するため、(2)に合わない。
補足コラム
トランザクションの隔離レベルはANSI/ISO SQL標準で定義されており、主に4段階あります。
- READ UNCOMMITTED:未コミットデータの読み込みを許可(ダーティリード発生)。
- READ COMMITTED:コミット済みデータのみ読み込み(ダーティリード防止)。
- REPEATABLE READ:同一トランザクション内での読み込み値の一貫性を保証。
- SERIALIZABLE:完全な直列化を保証し、すべての競合を防止。
これらの違いを理解することは、データベースの整合性確保やパフォーマンス調整に不可欠です。
FAQ
Q: ダーティリードとは何ですか?
A: 他のトランザクションが未コミットの変更を読み込むことで、後にロールバックされる可能性がある不確定なデータを参照する現象です。
Q: READ COMMITTEDでノンリピータブルリードは発生しますか?
A: はい。READ COMMITTEDは再読込み時に他トランザクションのコミット済み変更を反映するため、ノンリピータブルリードが発生します。
Q: SERIALIZABLEはどのような場合に使うべきですか?
A: データの完全な整合性が必要で、競合や不整合を絶対に避けたい場合に使用しますが、性能低下のリスクがあります。
関連キーワード: トランザクション、隔離レベル、ダーティリード、ノンリピータブルリード、READ COMMITTED, SQL, データベース整合性