データベースの基礎

在庫表のある商品の在庫数は10である。トランザクションT1は在庫数を読み出して3を引いた値を書き込み、T2は在庫数を読み出して5を引いた値を書き込む。ロックをかけずに、T1の読み出し、T2の読み出し、T1の書き込み、T2の書き込みの順に実行されたとき、最終的な在庫数はいくつになるか。

  1. A2
  2. B5
  3. C7
答えと解説を見る

正解:B. 5

T1とT2はどちらも、相手が書き込む前の在庫数10を読み出します。T1は 10 − 3 = 7 を書き込みますが、そのあとT2が、自分が読み出した10をもとに計算した 10 − 5 = 5 で上書きするので、最終的な在庫数は5になります。本来は2つの処理を順番に行った 10 − 3 − 5 = 2 になるべきで、T1の更新が失われています。これを更新の消失(ロストアップデート)と呼びます。防ぐには、読み出すときに専有ロック(排他ロック)をかけて、T1が終わるまでT2の読み出しを待たせる(SELECT … FOR UPDATE など)か、UPDATE 在庫 SET 在庫数 = 在庫数 - 3 のように、読み出しと書き込みを1つのSQL文で行います。

  • A. 2つの処理を順番に実行した場合の正しい値ですが、この順序ではT1の更新が失われます。
  • B. 正しい。T2が古い値10をもとに計算した5で上書きし、T1の更新が失われます。
  • C. T1が書き込んだ値です。そのあとT2が上書きします。
この分野を解く 分野ページへ

関連する計算ツール

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

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

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

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