隔離性水準と読取り現象
トランザクション T1,T2 が次の順に実行された。SQL 規格の隔離性水準の定義に照らして,この実行結果が起こり得る T1 の隔離性水準を全て挙げたものはどれか。
1: T1: SELECT COUNT(*) FROM 注文 WHERE 顧客番号 = 100 → 3
2: T2: INSERT INTO 注文 VALUES (5001, 100, 1200)
3: T2: COMMIT
4: T1: SELECT COUNT(*) FROM 注文 WHERE 顧客番号 = 100 → 4
5: T1: COMMIT- アSERIALIZABLE だけ
- イREAD UNCOMMITTED だけ
- ウREAD UNCOMMITTED,READ COMMITTED,REPEATABLE READ
- エREAD UNCOMMITTED,READ COMMITTED
正解と解説を見る
正解 ウ
この問題の基礎知識
- SQL 規格の隔離性水準は,弱い順に READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE の 4 つであり,水準ごとに防止する異常現象が定められている。
- ダーティリードは他のトランザクションが未コミットの更新を読む現象,ノンリピータブルリードは同じ行を再び読むと他のトランザクションのコミット済みの更新によって値が変わっている現象である。
- ファントムは,同じ検索条件で再検索したときに,他のトランザクションが挿入などをしてコミットした行によって,結果の行の集合が変わる現象である。
- 規格の定義では,READ COMMITTED はダーティリードを防ぎ,REPEATABLE READ は加えてノンリピータブルリードを防ぐ。ファントムまで防ぐのは SERIALIZABLE だけである。
アSERIALIZABLE だけ
SERIALIZABLE は直列に実行した場合と同じ結果を保証し,ダーティリード,ノンリピータブルリード,ファントムのいずれも発生しない。この実行結果が起こり得ない唯一の水準である。
イREAD UNCOMMITTED だけ
未コミットのデータを読むダーティリードと誤解した選択である。T2 は手順 3 でコミットしており,T1 は手順 4 でコミット済みの行を読んでいるので,READ UNCOMMITTED 以外の水準でも起こり得る。
ウREAD UNCOMMITTED,READ COMMITTED,REPEATABLE READ正解
同じ検索条件で再検索したときに,他のトランザクションが挿入しコミットした行が現れる現象はファントムである。SQL 規格の定義では,ファントムを防止するのは SERIALIZABLE だけで,他の 3 水準では起こり得る(製品によっては REPEATABLE READ でも防止される)。
エREAD UNCOMMITTED,READ COMMITTED
既に読んだ行の値が変わるノンリピータブルリードと誤解した選択である。ここでは新しい行の挿入で件数が変わっており,ファントムに当たる。REPEATABLE READ はファントムを防止しない。
検証用の出典レビュー済み
ISO/IEC 9075-2 SQL/Foundation / JIS X 3005-2 データベース言語 SQL 第 2 部:基本機能