本文へスキップ

平成24年度 秋期 ITパスポート試験 問80

この問題の解説と、これまでの解答の記録です。

問80
頻出度★☆☆

ある在庫管理システムは,複数の入力を同時並行して処理し,在庫数を更新しているが,排他制御は行っていない。ある時点での在庫数が 100 であったとき,入力された二つの入力 A,B に応じて,図に示す処理が ① → ② → ③ → ④ の順序で実行された場合,処理④が終了した時点の在庫数は幾つになるか。 在庫管理システム

入力処理内容
入力A① “在庫数”を読み込み,入庫数の 50 を加える。<br>④ 結果を“在庫数”に書き込む。
入力B② “在庫数”を読み込み,出庫数の 30 を引く。<br>③ 結果を“在庫数”に書き込む。
出典 平成24年度 秋期 ITパスポート試験 問80
解説

問 80

  • 不正解ア

    70 は処理③が終わった時点、すなわち入力B が「100−30」の結果を書き込んだ直後の在庫数である。設問が問うているのは処理④が終了した時点の値であり、その後の ④ で入力A が① の時点で計算していた 150 を上書きしてしまうため、70 は最終値として残らない。逆に ③ と ④ の順序が入れ替わった (A が先に書き、B が後で書く) 場合の答えが 70 になる。

  • 不正解イ

    100 は更新前の初期在庫数そのままの値である。排他制御がなくてもロストアップデートで消えるのは片方の更新だけであり、最後に書き込みを行った処理④の結果 (=150) は確実にデータへ反映される。入力A・入力B の両方の更新がまとめて無効になる状況ではないので、100 のまま変わらないということはない。

  • 不正解ウ

    120 は 100+50−30 で、入力A と入力B の更新が両方とも正しく反映された場合の値、すなわち排他制御を正しく行って A と B を直列化 (一方が読込みから書込みまで終えてから他方を開始) した場合に得られる本来あるべき在庫数である。本問はまさにその排他制御を行っていないケースで、① と ② がどちらも書込み前の 100 を読んでしまうため、この 120 にはならない。この選択肢との差 (150 と 120 の 30) が、失われた入力B の出庫分に相当する。

  • エ

    正解 正解はエ「150」。排他制御 (ロック) を行っていないため、入力A と入力B が同じ共有データ「在庫数」を読み書きする際に互いの更新が保護されず、いわゆるロストアップデート (更新の消失) が起こる。処理を ① → ② → ③ → ④ の順に 1 ステップずつ追うと次のようになる。まず初期状態の在庫数は 100。① で入力A が「在庫数」を読み込み、読み取った 100 に入庫数の 50 を加えて 150 を自分の作業領域に保持する — この時点ではまだ書き込んでいないので、データベース上の在庫数は 100 のままである。次に ② で入力B が「在庫数」を読み込むが、A の結果は未反映なので B が読める値も 100 であり、そこから出庫数の 30 を引いて 70 を自分の作業領域に保持する。③ で入力B が 70 を書き込み、在庫数は 70 になる。最後に ④ で入力A が、① の時点で計算して持っていた 150 をそのまま書き込む。この書込みは B が書いた 70 を上書きしてしまうため、処理④が終了した時点の在庫数は 150 となる。つまり入力B の出庫 30 の反映が完全に失われており、これが排他制御を行わない並行更新の典型的な誤りである。

ここがポイント
  • 排他制御 (ロック) とロストアップデート — 複数の処理が同じデータを並行して更新するとき、排他制御を行わないと「読込み → 計算 → 書込み」の間に他方が割り込み、後から書き込んだ側が先の更新を上書きして更新が消失する。防ぐには、読込み時にロックをかけて書込み完了まで他方を待たせ、更新処理を直列化する。
  • 並行処理はステップ単位で追跡する — 各処理が値を読み込んだ時点でデータベース上にある値は何かを 1 ステップずつ書き出すのが解法の型。計算結果は書き込むまで作業領域にあるだけで共有データには反映されず、最終値は最後に書き込んだ処理の値になる。
用語

解答の記録