データベースの基礎

トランザクションT1が SELECT COUNT(*) FROM 注文 WHERE 金額 >= 1000 を実行したところ8件だった。その直後に、T2が金額2000の注文の行をINSERTしてコミットした。T1が同じSELECT文をもう一度実行すると9件になった。この現象はどれか。

  1. Aノンリピータブルリード
  2. Bダーティリード
  3. Cファントムリード
答えと解説を見る

正解:C. ファントムリード

1つのトランザクションの中で同じ条件の検索を繰り返したとき、その間にほかのトランザクションが条件に合う行を追加(または削除)してコミットしたために、結果の行の集まりが変わる現象をファントムリード(ファントム)と呼びます。新しく現れた行が幽霊(ファントム)のようだ、というのが名前の由来です。ノンリピータブルリードは、すでに読んだ同じ行を、ほかのトランザクションがUPDATEやDELETEしてコミットしたために、読み直すと値が変わっている(または行がなくなっている)現象です。既存の行にかけたロックでは、まだ存在しない行の追加を防げないため、ファントムを防ぐには、検索の条件に当たる範囲をロックするなどの仕組みが必要です。SQLの標準規格では、分離レベルをSERIALIZABLEにするとファントムも起きません。T2はコミットしているので、ダーティリードではありません。

  • A. ノンリピータブルリードは、すでに読んだ同じ行の値が、ほかのトランザクションの更新で変わる現象です。
  • B. T2はコミットしているので、コミット前のデータを読むダーティリードではありません。
  • C. 正しい。同じ条件の検索で、ほかのトランザクションが追加した行が新たに現れる現象です。
この分野を解く 分野ページへ

関連する計算ツール

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

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

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

  1. SQLの標準規格が定める分離レベルのうち、READ COMMITTED で起こりうる現象の組み合わせとして正しいものはどれか。
  2. トランザクションT1が、ある行に共有ロックをかけて読み出している。この行に対して、T2が共有ロックを、T3が専有ロック(排他ロック)を要求した。T1がロックを解除するまでの間について、正しいものはどれか。
  3. トランザクションの排他制御で使われる2相ロック方式の説明として、正しいものはどれか。
  4. トランザクションT1は行Aに専有ロックをかけたあと行Bのロックを要求し、T2は行Bに専有ロックをかけたあと行Aのロックを要求したため、どちらも先へ進めなくなった。DBMSがこの状態を検出したときに行う一般的な対処はどれか。
  5. 多くのDBMSは、データを更新するとき、更新の内容をログ(ジャーナル)に記録し、そのログをデータベース本体より先に不揮発性の記憶装置に書き込む(WAL: ログ先行書き込み)。この方式をとる主な理由はどれか。