本文へスキップ

平成25年度 秋期 ITパスポート試験 問67

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

問67
頻出度★☆☆

あるトランザクション処理は, ①共有領域から値を読み取り, ②読み取った値に数値を加算し, ③結果を共有領域に書き込む手順からなっている。複数のトランザクションを並列に矛盾なく処理するためには, トランザクション処理のどの時点で共有領域をロックし, どの時点でロックを解除するのが適切か。 時間(上から下へ進む) - 時点(a) - ① 共有領域から値を読み取り - 時点(b) - ② 読み取った値に数値を加算 - 時点(c) - ③ 結果を共有領域に書き込む - 時点(d)

出典 平成25年度 秋期 ITパスポート試験 問67
解説

問 67

  • 不正解ア

    ロックは時点(a) で正しいものの、解除が時点(c)、つまり ③書込みの前です。時点(c) で解除すると、まだ古い値が共有領域に残ったまま他のトランザクションが読み取れてしまい、その後に本トランザクションが書き込むため、どちらかの加算が失われます (ロストアップデート)。書込みを保護できていないので不適切です。

  • イ

    正解 正解は イ (ロック=時点(a)、ロック解除=時点(d))。この処理が共有領域に触れるのは ①読取り と ③書込み の二か所で、②の加算は①で読んだ値を前提にしています。つまり「①で読んだ値が、③で書き戻すまでの間に他のトランザクションに変更されない」ことが保証されて初めて、結果が矛盾しません。そのためロックは ①読取りの直前=時点(a) で掛け、解除は ③書込みの直後=時点(d) で行うのが適切です。こうすれば ①〜③ の一連が不可分な処理単位となり、他のトランザクションは時点(d) 以降に「更新後の値」を読むので、加算が消える事故 (ロストアップデート) が起きません。逆に少しでも範囲を狭めると、読取りと書込みの間に他方が割り込む余地が生まれます。

  • 不正解ウ

    ロックが時点(b)、つまり ①読取りの後なので、読取りが無保護です。複数のトランザクションが同じ古い値を読んでしまう可能性があります。さらに解除が時点(c) で ③書込みの前なので、書込みも保護されていません。読取り・書込みの両方が排他範囲の外にあり、最も不適切な組合せです。

  • 不正解エ

    解除が時点(d) である点は妥当ですが、ロックが時点(b) と ①読取りの後になっています。時点(a)〜(b) の読取りが無保護のため、二つのトランザクションが同じ値を読んでからそれぞれ加算・書込みを行うと、後から書いた値が先の更新を上書きし、加算が一回分消えてしまいます。ロックは共有領域を読む前に掛ける必要があります。

ここがポイント
  • 排他制御 (ロック) の範囲は「共有データを読む直前から、書き戻した直後まで」。読取りから書込みまでを一つの不可分な単位として保護しないと、ロストアップデート (更新の消失) が発生する。
  • read → 計算 → write の形をとる更新処理では、読取り時点の値を前提に書き込むため、読取りだけ、あるいは書込みだけをロックしても整合性は保てない。
用語

解答の記録