データベースの基礎
トランザクションを同時に実行したときに起きる問題のうち、ダーティリードの説明として正しいものはどれか。
- Aほかのトランザクションがまだコミットしていない更新を読み出し、そのトランザクションがロールバックしたため、存在しなかった値を使ってしまう
- B同じトランザクションの中で同じ行を2回読み出すと、その間にほかのトランザクションがその行を更新してコミットしたため、値が変わっている
- C同じ条件の検索を2回行うと、その間にほかのトランザクションが行を追加してコミットしたため、行の数が変わっている
答えと解説を見る
正解:A. ほかのトランザクションがまだコミットしていない更新を読み出し、そのトランザクションがロールバックしたため、存在しなかった値を使ってしまう
ダーティリードは、コミットされていない(確定していない)データを読み出してしまう問題です。更新したトランザクションがあとでロールバックすると、読み出した値は一度も確定しなかった値になり、それをもとにした処理が誤りになります。同じ行を2回読んだら値が変わっていたというのはノンリピータブルリード(反復不能読み取り)で、検索の条件に合う行が増えたり減ったりしたのはファントムリード(ファントム)です。これらは、トランザクションの独立性(隔離性)が十分でないために起きる問題で、SQLでは分離レベルを設定して、どこまで防ぐかを選びます。READ COMMITTED 以上の分離レベルでは、ダーティリードは起きません。
- A. 正しい。コミットされていない更新を読み出してしまうのがダーティリードです。
- B. これはノンリピータブルリードの説明です。
- C. これはファントムリードの説明です。