データベーススペシャリスト 2011年 午前2 問15
問題文
データベースのトランザクション T2 の振る舞いのうち、ダーティリード (dirty read)に関する記述はどれか。
選択肢
ア:トランザクション T1 が行を検索し、トランザクションT2がその行を更新する。その後 T1 は先に読んだ行を更新する。その後に T2 が同じ行を読んでも、先の T2による更新が反映されない値を得ることになる。
イ:トランザクション T1 が行を更新し、トランザクション T2がその行を検索する。その後 T1 がロールバックされると、T2 はその行に存在しない値を読んだことになる。(正解)
ウ:トランザクション T2 がある条件を満たす行を検索しているときに、トランザクション T1 が T2 の検索条件を満たす行を挿入する。その後 T2 が同じ条件でもう一度検索を実行すると、前回は存在しなかった行を読むことになる。
エ:トランザクション T2 が行を検索し、トランザクション T1 がその行を更新する。その後 T2 が同じ行を検索した場合、同じ行を読んだにもかかわらず、異なる値を得ることになる。
🔒 解説は解答すると表示されます
ダーティリード【午前2解説】
正解の理由
ダーティリードとは、あるトランザクションが別のトランザクションによってまだコミットされていない更新(未確定のデータ)を読み取り、その後その更新を行ったトランザクションがロールバックしたために、読み取った値が存在しなくなる(取り消される)現象です。設問の選択肢のうち、トランザクション T1 が行を更新し、トランザクション T2 がその更新を読み取り、その後 T1 がロールバックされることで T2 が「存在しない値を読んだ」状況を示しているのが イ です。これがダーティリードの典型的な定義に一致します。
解法ステップ
- 「読んだ値が後で取り消される」「ロールバック」「未コミットの更新を読み取る」といったキーワードを探す。
- 各選択肢が示す現象を、データベースの代表的な並行性異常(ダーティリード、非リピータブルリード、ファントムリード、ロストアップデート等)に対応付ける。
- ダーティリードの定義と完全に一致する文を選ぶ(未コミットデータの読み取り+その後ロールバック)。
具体的には、選択肢の文に「ロールバック」による取り消しが含まれ、かつ読み取りが先行しているかを確認すればよいです。これに該当するのが イ です。
選択肢別の誤答解説
- ア: 説明は「ロストアップデート(lost update)」に近い状況を表しています。T2 の更新が T1 によって上書きされるため、T2 の更新が失われる(後で読み返しても反映されない)という問題であり、未コミットの読み取り(ダーティリード)ではありません。
- イ: 正答。T1 が更新し T2 が読み取った後に T1 がロールバックされるため、T2 が読み取った値は取り消される—これこそダーティリードです。
- ウ: 条件を満たす行が挿入され、次回の検索で新しい行が見えるという現象は「ファントムリード(phantom read)」です。既存の行の値が変わるのではなく、検索結果の行集合が増減する点が特徴です。
- エ: 同一トランザクション内で繰り返し読んだ値が変わる現象を表しており、これは「非リピータブルリード(non‑repeatable read)」です。同一トランザクションでの読み直しで値が変わるため、ダーティリードとは異なります。
よくある誤解
- 「同じ行を異なる値で読む=ダーティリード」と誤認する点
→ 同一トランザクション内で繰り返し読んだときに値が変わる現象は「非リピータブルリード」です。ダーティリードは「未コミットの更新を他トランザクションが読んだ後にその更新が取り消される」ことが本質です。 - 「ロールバックがなければダーティリードではない」との単純化
→ ロールバックが起きない場合でも、未コミットデータを読む行為自体がダーティリード(Read Uncommitted の性質)と呼ばれます。確認される問題はロールバックが発生したときに顕在化しますが、未コミットの読み取り自体が危険です。
補足コラム
トランザクションの隔離レベルと発生しうる異常の関係(概略)
- Read Uncommitted: ダーティリードを許す(dirty read 発生可能)
- Read Committed: ダーティリードは防ぐが、非リピータブルリードやファントムリードは発生しうる
- Repeatable Read: 非リピータブルリードを防ぐが、ファントムは発生する場合がある(実装依存)
- Serializable: ほぼすべての並行性異常を防ぐ(最も高い隔離)
実務ではダーティリードはデータ整合性を壊すリスクが高いため、多くのデータベースでデフォルトで防止されています(例: Read Committed がデフォルトのDBが多い)。必要に応じて適切な隔離レベルを選ぶこと、あるいは行ロックや楽観的ロックを用いることが有効です。
FAQ
Q: ダーティリードと非リピータブルリードの違いは何ですか?
A: ダーティリードは「他トランザクションの未コミット更新を読み、その更新が後で取り消される可能性がある」こと。非リピータブルリードは「同一トランザクション内で同じ行を再読したときに値が変わる」現象で、更新がコミット済みであっても発生します。定義を混同しないことが重要です。
A: ダーティリードは「他トランザクションの未コミット更新を読み、その更新が後で取り消される可能性がある」こと。非リピータブルリードは「同一トランザクション内で同じ行を再読したときに値が変わる」現象で、更新がコミット済みであっても発生します。定義を混同しないことが重要です。
Q: どの隔離レベルでダーティリードが発生しますか?
A: Read Uncommitted(最も低い隔離レベル)で発生します。Read Committed 以上では原則として発生しません。
A: Read Uncommitted(最も低い隔離レベル)で発生します。Read Committed 以上では原則として発生しません。
Q: ダーティリードを防ぐ最も一般的な対策は?
A: 隔離レベルを Read Committed 以上に設定するか、適切なロック機構(排他ロック)を使用することです。
A: 隔離レベルを Read Committed 以上に設定するか、適切なロック機構(排他ロック)を使用することです。
関連キーワード: ダーティリード、非リピータブルリード、ファントムリード、ロストアップデート、隔離レベル、Read Uncommitted、Read Committed、Repeatable Read、Serializable

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

