戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 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が「存在しない値を読んだ」状況を示しているのが イ です。これがダーティリードの典型的な定義に一致します。

解法ステップ

  1. 「読んだ値が後で取り消される」「ロールバック」「未コミットの更新を読み取る」といったキーワードを探す。
  2. 各選択肢が示す現象を、データベースの代表的な並行性異常(ダーティリード、非リピータブルリード、ファントムリード、ロストアップデート等)に対応付ける。
  3. ダーティリードの定義と完全に一致する文を選ぶ(未コミットデータの読み取り+その後ロールバック)。
具体的には、選択肢の文に「ロールバック」による取り消しが含まれ、かつ読み取りが先行しているかを確認すればよいです。これに該当するのが イ です。

選択肢別の誤答解説

  • ア: 説明は「ロストアップデート(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: ダーティリードは「他トランザクションの未コミット更新を読み、その更新が後で取り消される可能性がある」こと。非リピータブルリードは「同一トランザクション内で同じ行を再読したときに値が変わる」現象で、更新がコミット済みであっても発生します。定義を混同しないことが重要です。
Q: どの隔離レベルでダーティリードが発生しますか?
A: Read Uncommitted(最も低い隔離レベル)で発生します。Read Committed以上では原則として発生しません。
Q: ダーティリードを防ぐ最も一般的な対策は?
A: 隔離レベルをRead Committed以上に設定するか、適切なロック機構(排他ロック)を使用することです。

関連キーワード: ダーティリード、非リピータブルリード、ファントムリード、ロストアップデート、隔離レベル、Read Uncommitted、Read Committed、Repeatable Read、Serializable
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリストを
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について