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


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

解説

二つのトランザクションが、同じデータに対して更新、参照を行うときに発生し得るダーティリードの事象【午前2 解説】

要点まとめ

  • 結論:ダーティリードは「未コミットの更新データを他トランザクションが参照する現象」であり、正解はエです。
  • 根拠:トランザクションAが更新したがコミット前のデータをトランザクションBが読み取り、その後ロールバックされるため不整合が生じます。
  • 差がつくポイント:コミット前のデータ参照がダーティリード、コミット後の参照はノンダーティリードである点を正確に理解することが重要です。

正解の理由

選択肢エは「まだコミットしていないトランザクションAの更新後データをトランザクションBが参照し、その後ロールバックされた」という状況を示しています。これはまさにダーティリードの定義に合致します。未確定の変更を他のトランザクションが読み取るため、もしロールバックされると参照したデータは存在しない不正確な情報となり、データの整合性が損なわれます。

よくある誤解

ダーティリードは「更新後のデータを参照すること」ではなく「コミット前の更新データを参照すること」がポイントです。コミット済みの変更を参照するのは正常な動作です。

解法ステップ

  1. ダーティリードの定義を確認する:「未コミットの更新データを他トランザクションが参照すること」
  2. 各選択肢の状況を「コミットの有無」と「参照のタイミング」で整理する
  3. コミット前の更新データを参照している選択肢を特定する
  4. ロールバックが発生しているか確認し、整合性問題が起きるか判断する
  5. 以上の条件を満たす選択肢エを正解とする

選択肢別の誤答解説

  • ア: 新しい行の挿入とコミット後の参照であり、ダーティリードではなくファントムリードに近い現象です。
  • イ: 更新後にコミットされているため、トランザクションAが再参照した値が変わってもダーティリードではありません。
  • ウ: デッドロックはロック競合による待機状態であり、ダーティリードとは別の問題です。
  • : 未コミットの更新データを参照し、その後ロールバックされたためダーティリードの典型例です。

補足コラム

ダーティリードはトランザクション分離レベルの「Read Uncommitted」で発生しやすい問題です。多くのデータベースは「Read Committed」以上の分離レベルを採用し、ダーティリードを防止しています。トランザクションの整合性を保つためには適切な分離レベルの設定が重要です。

FAQ

Q: ダーティリードとファントムリードの違いは何ですか?
A: ダーティリードは未コミットの更新データを読むこと、ファントムリードは同じ検索条件で再検索した際に新しい行が現れる現象です。
Q: ロールバックがなければダーティリードは問題になりませんか?
A: ロールバックがなければデータは確定しているため、ダーティリードとは呼びません。問題は未確定データの参照にあります。

関連キーワード: トランザクション, ダーティリード, 分離レベル, ロールバック, データ整合性, 2相ロック, デッドロック
← 前の問題へ次の問題へ →

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