ホーム > データベーススペシャリスト試験 > 2011年
データベーススペシャリスト試験 2011年 午前2 問15
データベースのトランザクション T2 の振る舞いのうち, ダーティリード (dirty read)に関する記述はどれか。
ア:トランザクション T1 が行を検索し、トランザクションT2がその行を更新する。その後 T1 は先に読んだ行を更新する。その後に T2 が同じ行を読んでも、先の T2による更新が反映されない値を得ることになる。
イ:トランザクション T1 が行を更新し、トランザクション T2がその行を検索する。その後 T1 がロールバックされると, T2 はその行に存在しない値を読んだことになる。(正解)
ウ:トランザクション T2 がある条件を満たす行を検索しているときに, トランザクション T1 が T2 の検索条件を満たす行を挿入する。その後 T2 が同じ条件でもう一度検索を実行すると, 前回は存在しなかった行を読むことになる。
エ:トランザクション T2 が行を検索し、トランザクション T1 がその行を更新する。その後 T2 が同じ行を検索した場合, 同じ行を読んだにもかかわらず, 異なる値を得ることになる。
解説
ダーティリード(Dirty Read)とは?
データベースのトランザクションにおける ダーティリード とは、あるトランザクションがほかのトランザクションによってまだコミットされていない(確定していない)変更を読み取ってしまう現象を指します。
これは問題となる理由は、もし変更を行ったトランザクションが後でロールバック(取り消し)された場合、読み取った値は存在しなかったはずの「不確定な値」であり、データの整合性を損なうことになるからです。
これは問題となる理由は、もし変更を行ったトランザクションが後でロールバック(取り消し)された場合、読み取った値は存在しなかったはずの「不確定な値」であり、データの整合性を損なうことになるからです。
選択肢の解説
各選択肢を見て、どれがダーティリードの説明にあたるか確認しましょう。
ア:
- T1が行を検索する
- T2がその行を更新する
- T1は先に読んだ行を更新
- T2が同じ行を読んでも先のT2の更新が反映されない
評価:
これはトランザクションの更新タイミングや可視性の問題(たとえばロックの問題や一貫性の問題)に関係していますが、ダーティリードの定義とは異なります。
これはトランザクションの更新タイミングや可視性の問題(たとえばロックの問題や一貫性の問題)に関係していますが、ダーティリードの定義とは異なります。
イ:
- T1が行を更新する
- T2がその行を検索(読む)
- その後T1がロールバックされる
- 結果としてT2は存在しない値を読んでしまう
評価:
これはまさにダーティリードの典型的な例です。
T2はT1のコミット前の変更を読み取ってしまい、後にT1の変更が取り消されたため読むべきでなかった値を取得("dirty data")してしまいます。
これはまさにダーティリードの典型的な例です。
T2はT1のコミット前の変更を読み取ってしまい、後にT1の変更が取り消されたため読むべきでなかった値を取得("dirty data")してしまいます。
ウ:
- T2が条件を満たす行を検索中に
- T1が条件を満たす行を挿入
- T2が再検索すると新たな行が読める
評価:
これは ファジリード(phantom read) の例に似ています。
トランザクション中に他のトランザクションが新たな行を追加して、結果が変わってしまう現象です。
よってダーティリードではありません。
これは ファジリード(phantom read) の例に似ています。
トランザクション中に他のトランザクションが新たな行を追加して、結果が変わってしまう現象です。
よってダーティリードではありません。
エ:
- T2が行を検索
- T1が行を更新
- T2が再度同じ行を検索すると異なる値を得る
評価:
これは リピータブルリード(repeatable read)違反 の可能性を示しています。
同じクエリ結果が変わる問題ですが、ダーティリードとは異なる現象です。
これは リピータブルリード(repeatable read)違反 の可能性を示しています。
同じクエリ結果が変わる問題ですが、ダーティリードとは異なる現象です。
まとめ
- ダーティリードは「コミットされていない変更を読み取ってしまい、その変更が後にロールバックされたため不正確なデータを読み込んでしまうこと」。
- 選択肢の中でこれに該当するのは「イ」です。
追加補足: ダーティリードを防ぐ方法
- データベースのトランザクション分離レベルの設定によって制御可能です。
- たとえば、
READ UNCOMMITTED
はダーティリードを許すが、READ COMMITTED
以上では防がれます。
以上より、正解は「イ」となります。