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

- ア| 共有領域のロック | 共有領域のロック解除 | |---|---| | 時点(a) | 時点(c) |
- イ| 共有領域のロック | 共有領域のロック解除 | |---|---| | 時点(a) | 時点(d) |
- ウ| 共有領域のロック | 共有領域のロック解除 | |---|---| | 時点(b) | 時点(c) |
- エ| 共有領域のロック | 共有領域のロック解除 | |---|---| | 時点(b) | 時点(d) |
正解と解説を見る
正解
イ | 共有領域のロック | 共有領域のロック解除 | |---|---| | 時点(a) | 時点(d) |
正解は「時点(a)から時点(d)」である。複数のトランザクションが矛盾なく処理されるためには、共有領域の値を読み取る前(時点a)からロックを開始し、読み取り・加算・書き込みという一連の処理がすべて完了した後(時点d)にロックを解除する必要がある。途中の時点(bやc)でロックを解除してしまうと、他のトランザクションが処理途中の値を読み取ってしまい、更新結果が失われるなどの不整合(ロストアップデート)が発生するおそれがある。そのため、処理全体を排他制御の対象とする時点(a)から時点(d)までが正しい範囲である。