データベースの基礎
SQLの標準規格が定める分離レベルのうち、READ COMMITTED で起こりうる現象の組み合わせとして正しいものはどれか。
- Aダーティリード、ノンリピータブルリード、ファントムリードのいずれも起こらない
- Bダーティリードは起こらないが、ノンリピータブルリードとファントムリードは起こりうる
- Cダーティリードとノンリピータブルリードは起こらないが、ファントムリードは起こりうる
答えと解説を見る
正解:B. ダーティリードは起こらないが、ノンリピータブルリードとファントムリードは起こりうる
SQLの標準規格は、分離レベルを、防ぐ現象の少ない順に READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE の4つと定めています。READ UNCOMMITTED では、3つの現象がすべて起こりえます。READ COMMITTED は、コミットされたデータだけを読むのでダーティリードを防ぎますが、読むたびにその時点のコミット済みの値を見るので、ノンリピータブルリードとファントムリードは起こりえます。REPEATABLE READ はさらにノンリピータブルリードを防ぎますが、ファントムリードは起こりえます。SERIALIZABLE は3つとも防ぎ、トランザクションをある順番で1つずつ実行した場合と同じ結果を保証します。分離レベルを上げるほど、ロックの待ち合わせや処理のやり直しが増えて、同時に処理できる量は減るので、用途に応じて選びます。実際のDBMSでは、既定の分離レベルや、各レベルで実際に防げる現象が、標準規格の最低限の定めより強い場合があります。
- A. 3つとも起こらないのは SERIALIZABLE です。
- B. 正しい。READ COMMITTED が防ぐのはダーティリードだけです。
- C. これは REPEATABLE READ の性質です。