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

データベーススペシャリスト 2015年 午前216


問題文

二つのトランザクションが、同じデータに対して、更新、参照を行うときに発生し得るダーティリードの事象を記述したものはどれか。

選択肢

トランザクション A がある検索条件を満たすある表の行の集合を参照した。次に、トランザクションBがトランザクションAと同じ検索条件を満たす新しい行を挿入しコミットした。その後、トランザクション A が同じ検索条件で再度参照すると、以前には存在しなかった行が出現した。
トランザクションAがある表の行の列を参照した。次に、トランザクションBがその列の値を更新しコミットした。その後、トランザクション A がその列を再度参照すると、以前の値と異なった。
二つのトランザクションがそれぞれ 2 相ロックをかけ、デッドロックを起こした。
まだコミットしていないトランザクション A の更新後データをトランザクション Bが参照した。その後、更新後データはロールバックされた。(正解)

🔒 解説は解答すると表示されます

ダーティリード【午前2解説】

正解の理由

選択肢のうち、 が正解です。ダーティリードは「あるトランザクションが、他のトランザクションによって行われた更新を、その更新元トランザクションがコミットしていない段階で参照してしまうこと」を指します。 はまさに「トランザクションAが未コミットで行った更新をトランザクションBが参照し、その後Aがロールバックした」状況を示しており、参照時点で未コミットであったためダーティリードに該当します。参照が行われた時点で未コミットであれば、それ自体がダーティリードであり、後でコミットされたかロールバックされたかにかかわらず「参照時点はダーティ」であることを押さえてください。ロールバックが起きた場合、参照した側は存在しない(確定しない)データを基に処理した可能性があり、データ整合性の問題となります。

解法ステップ

  1. 各選択肢で「誰が」「いつ」参照したかを時系列で整理する。
  2. 参照が行われた瞬間に、参照対象の更新を行ったトランザクションがコミット済みか未コミットかを確認する。
  3. 参照時に未コミットであればダーティリード(正解候補)。参照時にコミット済みであればダーティリードではない(非リピータブルリードやファントム等の別現象の可能性あり)。
  4. ロールバックが発生している場合は、参照が未コミットデータを見たことによる整合性リスクを明確にする。

選択肢別の誤答解説

  • ア: 同じ検索条件で再参照した際に新しい行が現れる現象は「ファントムリード(phantom read)」です。挿入したトランザクションはコミット済みなので、参照はコミット済データを見ており、ダーティリードではありません。
  • イ: 最初と再参照で値が変わるのは「ノンリピータブルリード(非再現リード、non-repeatable read)」です。更新を行ったトランザクションがコミット済みであるため、やはりダーティリードには当たりません。
  • ウ: 二相ロックの結果デッドロックが起きるのは「デッドロック」で、読み取りのコミット状態とは直接関係ありません。
  • エ: 未コミットの更新を別トランザクションが参照し、その後更新がロールバックされているため、参照時点で未コミットデータを読み取った「ダーティリード」です。ロールバックにより参照が誤った(存在しない)状態のデータを基に行われた可能性が生じ、整合性問題になります。

よくある誤解

  1. 「後でコミットされればダーティリードではない」
    誤りです。ダーティリードかどうかは参照時点の更新のコミット状態で決まります。参照時に未コミットであればダーティリードであり、後でコミットされても「参照時点はダーティ」でした。
  2. 「ダーティリードはロールバックが起きたときだけ問題になる」
    ロールバックが起きると確かに明らかな整合性破壊になりますが、ロールバックがなくても未確定のデータに基づく処理はアプリケーションの意味的整合性を損なう可能性があり、リスクは依然として存在します。
  3. 「すべての読み取りがダーティリードの対象になる」
    読み取りがダーティになるかは参照時の隔離レベルやロックの有無によります。例えば Read Committed 以上の隔離レベルでは基本的にダーティリードは防がれます。

補足コラム

データベースの隔離レベルと代表的現象の対応は次のとおりです(簡略):
  • Read Uncommitted: ダーティリードを許す(最も緩い)
  • Read Committed: ダーティリードを防ぐが、ノンリピータブルリードやファントムは起き得る
  • Repeatable Read: ノンリピータブルリードを防ぐ(ただし実装によりファントムは別扱い)
  • Serializable: ファントムも含めた完全な直列化を提供(最も強い)
運用上は、参照系のクエリで未コミットデータを参照してしまうと、たとえば在庫引当や二重課金のような不整合を招くため、業務要件に応じて適切な隔離レベル・ロック戦略を選ぶことが重要です。

FAQ

Q1: 「未コミットの参照」とは具体的にいつを指しますか?
A1: 他トランザクションが更新(INSERT/UPDATE/DELETE)を行ってまだコミットしていない状態で、その更新後のデータを第三のトランザクションが参照した瞬間を指します。参照時点で未コミットであればダーティリードに該当します。
Q2: 参照時に未コミットだったが後でコミットされた場合、その参照は問題ですか?
A2: 参照時点が未コミットであったためダーティリードです。後でコミットされた場合は結果的に参照した値が「最終的に確定した値」と一致することもありますが、参照自体は未確定なデータを基に行われたためダーティリードである点に変わりはありません。したがって設計としては避けるべきです。
Q3: ロールバックが絶対に起きない運用ならダーティリードを許しても良いですか?
A3: ロールバックが理論上起きない保証がある場合でも、未コミットデータを基にした処理はトランザクション分離や並行性の観点で不確実性を招きます。業務上の整合性要求に応じて隔離レベルを設定するのが安全です。

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

\ せっかくなら /

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

クイズ画面へ遷移する

すぐに利用可能!

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

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