平成25年度 秋期 ITパスポート試験 問67 解説 トランザクション処理
あるトランザクション処理は,①共有領域から値を読み取り,②読み取った値に数値を加算し,③結果を共有領域に書き込む手順からなっている。複数のトランザクションを並列に矛盾なく処理するためには,トランザクション処理のどの時点で共有領域をロックし,どの時点でロックを解除するのが適切か。
- 時点(a) 時点(c)
- 時点(a) 時点(d) ✓ 正答
- 時点(b) 時点(c)
- 時点(b) 時点(d)
解説
この問題は、トランザクションの開始から終了までの全工程を一つの「まとまり」として保護できる選択肢を選ぶことで正解できます。具体的には、読み取り(工程1)の前にロックし、書き込み(工程3)が完全に終わった後に解除するのが正しい手順です。
トランザクション処理とロックの重要性
データベースや共有メモリにおけるトランザクション処理では、データの整合性を守ることが何よりも重要です。もし、ある人が計算している途中で別の人がデータを書き換えてしまうと、最終的な値が正しく計算されなくなります。
これを防ぐための手法が排他制御(ロック)です。ロックをかけることで、対象データに対して「自分がいま処理中だから他の人は触らないで」という状態を作り出します。
ロック範囲を決定する思考プロセス
この問題では、次の3つの工程が連続して行われることを考慮する必要があります。
- 共有領域から値を読み取る
- 読み取った値に数値を加算する
- 計算結果を共有領域に書き込む
もし、読み取り(工程1)よりあとの時点(b)でロックを開始するとどうなるでしょうか。工程1で値を読み取った直後に、別のトランザクションが値を書き換えてしまう可能性があります。そうなると、自分が持っている値は「すでに古い値」になってしまい、その後の加算結果も誤ったものになります。
そのため、ロックは必ずすべての処理が始まる前、つまり時点(a)で行う必要があります。
同様に、解除のタイミングも重要です。書き込み(工程3)が終わる前にロックを解除してしまうと、まだ計算結果が反映されていない古い値のまま、他者が処理を開始する隙を与えてしまいます。したがって、書き込みが完了した時点(d)まではロックを保持し続ける必要があります。
実務におけるトランザクション管理
この知識は、銀行の残高更新や在庫管理システムなどで極めて重要な役割を果たします。例えば、同時に2人が同じ在庫商品を注文した際、ロック処理が適切でないと、在庫数が正しく減算されず、在庫がマイナスになったり、注文数が実際の在庫を超えてしまったりする不具合が発生します。
このような一連の操作を「不可分な単位(アトミック)」として扱うことは、データベースのACID特性のA(Atomicity:原子性)にも深く関連する概念です。プログラミングの現場では、データベースのトランザクション機能を利用したり、セマフォやミューテックスといったロック機構を用いたりして、この保護を実装します。