跳到正文

平成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 在读写同一份共享数据「库存数量」时,双方的更新得不到保护,于是发生所谓的丢失更新(更新被覆盖而消失)。把处理按 ① → ② → ③ → ④ 的顺序一步一步追踪下来,情况如下。首先,初始状态的库存数量是 100。① 输入A 读取「库存数量」,把读到的 100 加上入库数 50,得到 150 并保存在自己的工作区中 —— 此时还没有写入,所以数据库中的库存数量仍然是 100。接着 ② 输入B 读取「库存数量」,但 A 的结果尚未写回,所以 B 读到的值同样是 100,再从中减去出库数 30,得到 70 并保存在自己的工作区中。③ 输入B 把 70 写入,库存数量变为 70。最后 ④ 输入A 把它在 ① 时算出并一直持有的 150 原样写入。这次写入会覆盖掉 B 写入的 70,因此处理④结束时的库存数量为 150。也就是说,输入B 出库 30 的更新完全丢失了,这正是不做排他控制的并发更新的典型错误。

ここがポイント
  • 排他控制(加锁)与丢失更新 —— 当多个处理并发更新同一份数据时,如果不做排他控制,「读取 → 计算 → 写入」的过程中另一方就会插进来,后写入的一方会覆盖先前的更新,导致该更新丢失。要防止这种情况,就要在读取时加锁,让另一方一直等到写入完成为止,从而把更新处理串行化。
  • 并发处理要按步骤逐一追踪 —— 解题的固定套路是:一步一步写出每个处理读取值的那一刻,数据库中实际存在的值是多少。计算结果在写入之前只停留在工作区里,并不会反映到共享数据上,最终值就是最后完成写入的那个处理所写的值。
用語
解答問80エ
练这一题

作答记录