ア:トランザクション T1 が行を検索し、トランザクションT2がその行を更新する。その後 T1 は先に読んだ行を更新する。その後に T2 が同じ行を読んでも、先の T2による更新が反映されない値を得ることになる。
イ:トランザクション T1 が行を更新し、トランザクション T2がその行を検索する。その後 T1 がロールバックされると, T2 はその行に存在しない値を読んだことになる。(正解)
ウ:トランザクション T2 がある条件を満たす行を検索しているときに, トランザクション T1 が T2 の検索条件を満たす行を挿入する。その後 T2 が同じ条件でもう一度検索を実行すると, 前回は存在しなかった行を読むことになる。
エ:トランザクション T2 が行を検索し、トランザクション T1 がその行を更新する。その後 T2 が同じ行を検索した場合, 同じ行を読んだにもかかわらず, 異なる値を得ることになる。
解説
データベースのトランザクション T2 の振る舞いのうち, ダーティリード (dirty read)に関する記述はどれか【午前2 解説】
要点まとめ
- 結論:ダーティリードとは、未確定(ロールバック可能)な他トランザクションの更新データを読み取る現象であり、正解はイです。
- 根拠:トランザクションT1が更新した行をT2が読み取り、その後T1がロールバックすると、T2は存在しないはずのデータを読んだことになるため、これがダーティリードの典型例です。
- 差がつくポイント:ダーティリードは「コミット前の変更を読み取る」ことに注目し、他の選択肢の現象(ファントムリードやリピータブルリードの問題)と区別することが重要です。
正解の理由
選択肢イは、トランザクションT1が行を更新し、その更新をT2が読み取った後にT1がロールバックする状況を示しています。ロールバックによりT1の更新は取り消されるため、T2は存在しないはずのデータを読み取ったことになり、これがまさにダーティリードの定義に合致します。つまり、コミットされていない変更を他トランザクションが読み取ることでデータの整合性が損なわれる問題です。
よくある誤解
ダーティリードは単に「異なる値を読む」ことではなく、「コミット前の変更を読む」ことを指します。コミット済みの変更を読む場合はダーティリードではありません。
解法ステップ
- ダーティリードの定義を確認する:「未コミットの変更を他トランザクションが読むこと」
- 各選択肢の状況を整理し、どのケースが未コミットの変更を読んでいるかを判断する
- ロールバックが発生し、読み取ったデータが存在しなくなるケースを探す
- それが選択肢イであることを確認する
選択肢別の誤答解説
- ア: T1とT2の更新・読み取り順序が複雑ですが、T2が更新を反映しない値を読むのはダーティリードではなく、読み取り一貫性の問題です。
- イ: 正解。未コミットの更新をT2が読み取り、T1のロールバックでデータが存在しなくなる典型的なダーティリード。
- ウ: T1がT2の検索条件を満たす行を挿入し、T2が再検索で新たな行を読む現象はファントムリードに該当します。
- エ: 同じ行を異なる値で読むのはリピータブルリードの問題であり、ダーティリードとは異なります。
補足コラム
ダーティリードはデータベースのトランザクション分離レベルの中で「Read Uncommitted」で発生しやすい問題です。多くの商用DBMSではデフォルトでこの問題を防ぐために「Read Committed」以上の分離レベルが設定されています。トランザクションの分離レベルを理解することは、データの整合性を保つ上で非常に重要です。
FAQ
Q: ダーティリードはどの分離レベルで発生しやすいですか?
A: 主に「Read Uncommitted」分離レベルで発生しやすく、他の分離レベルでは防止されます。
Q: ファントムリードとダーティリードの違いは何ですか?
A: ダーティリードは未コミットの変更を読むこと、ファントムリードはトランザクション中に新たな行が挿入・削除されることで検索結果が変わる現象です。
関連キーワード: トランザクション, ダーティリード, ロールバック, 分離レベル, ファントムリード, リピータブルリード