データベーススペシャリスト試験 2024年 午前2 問12
二つのトランザクションが, 同じデータに対して, 更新, 参照を行うときに発生し得るダーティリードの事象を記述したものはどれか。
ア:トランザクションAがある検索条件を満たすある表の行の集合を参照した。次に, トランザクションBがトランザクションAと同じ検索条件を満たす新しい行を挿入しコミットした。その後, トランザクションAが同じ検索条件で再度参照すると, 以前には存在しなかった行が出現した。
イ:トランザクションAがある表の行の列を参照した。次に, トランザクションBがその列の値を更新しコミットした。その後, トランザクションAがその列を再度参照すると, 以前の値と異なった。
ウ:二つのトランザクションがそれぞれ2相ロックをかけ, デッドロックを起こした。
エ:まだコミットしていないトランザクションAの更新後データをトランザクションBが参照した。その後, 更新後データはロールバックされた。(正解)
解説
二つのトランザクションが同じデータに対して更新・参照を行う際のダーティリード【午前2 解説】
要点まとめ
- 結論:ダーティリードとは、未コミットの更新データを他のトランザクションが参照する現象です。
- 根拠:トランザクションAが更新したがコミットしていないデータをトランザクションBが読み取り、その後Aがロールバックすると不整合が生じます。
- 差がつくポイント:未コミットデータの読み取りが許されるか否かがダーティリードの本質であり、これを防ぐために適切な分離レベル設定が重要です。
正解の理由
選択肢エは「まだコミットしていないトランザクションAの更新後データをトランザクションBが参照し、その後ロールバックされた」状況を示しています。これはまさにダーティリードの定義そのものであり、未確定の変更を他トランザクションが読み取ることでデータの整合性が損なわれる典型例です。
よくある誤解
ダーティリードは単なるデータの更新や参照の違いではなく、未コミットの変更を他トランザクションが読み取ることに限定されます。コミット済みの変更を読むのはダーティリードではありません。
解法ステップ
- ダーティリードの定義を確認する(未コミットデータの読み取り)。
- 各選択肢の状況を「更新・参照」「コミットの有無」「ロールバックの有無」で整理する。
- 未コミットの更新データを他トランザクションが参照し、その後ロールバックされるケースを探す。
- それが選択肢エであることを確認し、正解とする。
選択肢別の誤答解説ステップ
- ア: 新しい行の挿入とコミット後の参照であり、未コミットデータの読み取りではないためダーティリードではない。
- イ: 更新後にコミット済みのデータを参照しているため、ダーティリードではなく通常の更新反映。
- ウ: デッドロックの説明であり、ダーティリードとは無関係。
- エ: 未コミットの更新データを他トランザクションが参照し、その後ロールバックされたためダーティリードの典型例。
補足コラム
ダーティリードはトランザクション分離レベルの「Read Uncommitted」で発生しやすい問題です。多くのDBMSではデフォルトで「Read Committed」以上に設定されており、ダーティリードを防止しています。トランザクションの整合性を保つためには適切な分離レベルの理解と設定が不可欠です。
FAQ
Q: ダーティリードはなぜ問題になるのですか?
A: 未コミットの変更を読み取ると、その変更がロールバックされた場合に誤ったデータを基に処理が進み、データの整合性が崩れるためです。
A: 未コミットの変更を読み取ると、その変更がロールバックされた場合に誤ったデータを基に処理が進み、データの整合性が崩れるためです。
Q: ダーティリードを防ぐにはどうすればよいですか?
A: トランザクションの分離レベルを「Read Committed」以上に設定し、未コミットデータの読み取りを禁止することが一般的な対策です。
A: トランザクションの分離レベルを「Read Committed」以上に設定し、未コミットデータの読み取りを禁止することが一般的な対策です。
関連キーワード: トランザクション, ダーティリード, 分離レベル, ロールバック, データ整合性, 2相ロック, デッドロック