データベース|平成25年度 秋期 ITパスポート試験(特別措置試験) 問67
あるトランザクション処理は,①共有領域から値を読み取り,②読み取った値に数値を加算し,③結果を共有領域に書き込む手順からなっている。複数のトランザクションを並列に矛盾なく処理するためには,トランザクション処理のどの時点で共有領域をロックし,どの時点でロックを解除するのが適切か。
〔図1 トランザクション処理の手順と時点〕(原典の図を書き起こしたものです。上から下へ時間が流れます)
| 順 | 内容 |
|---|---|
| — | 時点(a) |
| ① | 共有領域から値を読み取り |
| — | 時点(b) |
| ② | 読み取った値に数値を加算 |
| — | 時点(c) |
| ③ | 結果を共有領域に書き込む |
| — | 時点(d) |
〔表 ロックと解除の時点の組合せ〕
| 共有領域のロック | 共有領域のロック解除 | |
|---|---|---|
| ア | 時点(a) | 時点(c) |
| イ | 時点(a) | 時点(d) |
| ウ | 時点(b) | 時点(c) |
| エ | 時点(b) | 時点(d) |
- ロック=時点(a),解除=時点(c)
- ✓ これが正解ロック=時点(a),解除=時点(d)
- ロック=時点(b),解除=時点(c)
- ロック=時点(b),解除=時点(d)
解説
その間に他人が触ったら困るところ、で囲いを決めます。
この処理は、読み、足し、書き戻す三つの手順です。二つ目の計算は、一つ目で読んだ値をもとにしています。読んでから書くまでに他人が書き換えると、計算の元が古くなります。囲いは、読む前から書いた後までを覆う必要があります。読んだ後に囲うと、二人が同じ古い値を読んでしまいます。二人とも同じ値を足すので、片方の更新が消えてしまいます。書く前に囲いを解いても、同じことが起こります。解いた瞬間に、もう一方が古い値を読むからです。よって、最初の時点で囲い、最後の時点で解くのが正しい形です。排他制御の物差しは、読んだ値が書くまで変わらないと言えるかです。囲いの範囲は、その間に他人が触ったら困るところで決めます。ただし囲いを広げるほど、他の処理は待たされます。必要なだけ広く、それ以上は広げないのが原則です。
ほかの選択肢はなぜ違うのか
- 最初の時点で囲い、計算を終えたところで解くとしています。囲い始めは正しいので、半分は合っています。しかし書き戻す前に解くので、そこで割り込まれます。計算までを守る形を問われたなら、この組み合わせです。後ろが足りません。
- 読んだ後に囲い、書く前に解くとしています。始めも終わりも、どちらも内側に寄っています。読むところも書くところも、囲いの外に出てしまいます。最も狭い囲いを問われたなら、この組み合わせです。二か所ともまずい形です。
- 読んだ後に囲い、最後の時点で解くとしています。終わりは正しいので、こちらも半分は合っています。しかし読むところが囲いの外に残ってしまいます。書き戻しだけを守る形を問われたなら、この組み合わせです。前が足りません。
この問題に関係する言葉
- 排他制御同じデータを同時に更新しても、矛盾が起きないようにする仕組みです。先の処理が終わるまで、後の処理を待たせて防ぎます。
出典:平成25年度 秋期 ITパスポート試験(特別措置試験) 問67(改変:原典の図表をテキストに書き起こした)
同じ単元をまとめて解くならデータベースへ。
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)