データベースの基礎

トランザクションを同時に実行したときに起きる問題のうち、ダーティリードの説明として正しいものはどれか。

  1. Aほかのトランザクションがまだコミットしていない更新を読み出し、そのトランザクションがロールバックしたため、存在しなかった値を使ってしまう
  2. B同じトランザクションの中で同じ行を2回読み出すと、その間にほかのトランザクションがその行を更新してコミットしたため、値が変わっている
  3. C同じ条件の検索を2回行うと、その間にほかのトランザクションが行を追加してコミットしたため、行の数が変わっている
答えと解説を見る

正解:A. ほかのトランザクションがまだコミットしていない更新を読み出し、そのトランザクションがロールバックしたため、存在しなかった値を使ってしまう

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

  • A. 正しい。コミットされていない更新を読み出してしまうのがダーティリードです。
  • B. これはノンリピータブルリードの説明です。
  • C. これはファントムリードの説明です。
この分野を解く 分野ページへ

関連する計算ツール

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

データベースの基礎のほかの問題

  1. トランザクションT1が SELECT COUNT(*) FROM 注文 WHERE 金額 >= 1000 を実行したところ8件だった。その直後に、T2が金額2000の注文の行をINSERTしてコミットした。T1が同じSELECT文をもう一度実行すると9件になった。この現象はどれか。
  2. SQLの標準規格が定める分離レベルのうち、READ COMMITTED で起こりうる現象の組み合わせとして正しいものはどれか。
  3. トランザクションT1が、ある行に共有ロックをかけて読み出している。この行に対して、T2が共有ロックを、T3が専有ロック(排他ロック)を要求した。T1がロックを解除するまでの間について、正しいものはどれか。
  4. トランザクションの排他制御で使われる2相ロック方式の説明として、正しいものはどれか。
  5. トランザクションT1は行Aに専有ロックをかけたあと行Bのロックを要求し、T2は行Bに専有ロックをかけたあと行Aのロックを要求したため、どちらも先へ進めなくなった。DBMSがこの状態を検出したときに行う一般的な対処はどれか。