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