データの整合性を保つために必要な要素
業務アプリケーションでは一般的に、多くの種類のデータを複数のユーザーが同時に扱います。そのため、何も策を講じないと簡単にお互いのデータ編集処理がぶつかり、データの整合性が崩れてしまいます。
そこで、データの整合性を保つために重要なのが、次の2つです。
- トランザクション制御
- 排他制御
今回、次回と2回にわたってそれぞれ1つずつ取り上げていきます。今回はトランザクション制御について学んでいきましょう。
トランザクション制御とは
アプリケーションの動作のうち、「ある意味を持った一連の処理の塊」のことをトランザクションといいます。これまでの連載で作成してきたアプリケーションで言えば、場所、会議室の追加処理、更新処理、削除処理の塊が、それぞれ1つのトランザクションに該当します。
そして、トランザクション制御とはこの一つのトランザクション内でデータの整合性が保たれるようにすることです。
トランザクション制御の有無による動作の違い
トランザクション制御の有無でどのように動作が変わるのか、実際に例を挙げてみてみましょう。
まず、サンプルアプリケーションの会議室予約システムでは、次にように予約情報の登録について履歴を残すとしましょう。
このときは更新処理として予約IDが1のデータの予約終了日時を6/1 12:00に変更するとします。その際、何らかのエラーにより予約履歴の更新時にエラーが発生した場合を考えてみます。
1. トランザクション制御なし
トランザクション制御を行わない場合、予約、予約履歴テーブルの更新はそれぞれ独立して行われます。従って、上記のケースでは予約テーブルは更新されますが、予約の変更に対応した予約履歴の登録が行われません。結果として、データの整合性が取れなくなってしまいます。
2. トランザクション制御有り
トランザクション制御する場合、予約、予約履歴テーブルの更新を1つの塊として処理します。そのためには、更新処理を始める前に明示的にトランザクションの開始、更新処理終了後にトランザクションの処理の確定(これをコミットと呼びます)を行う必要があります。
また、トランザクション処理中にエラーが発生した場合、トランザクションの処理の取消(これをロールバックと呼びます)を行うこともできます。
従って、トランザクション制御なしの時とは違い、予約履歴テーブル更新時にエラーが発生した場合、ロールバックを行うことで予約、予約履歴とも更新処理開始前の状態に戻すことができます。
トランザクション制御の必要性
本連載のサンプルがそうであるように、実際の業務アプリケーションでは、前述のようなヘッダー、明細型データや、バッチ処理で複数のデータを一度に更新するといったことは非常によくあることです。従って、トランザクション制御も原則として行わなければならないものだと思ってよいでしょう。
例外的にトランザクション制御を行わなくてもよい例としては、単純なマスターメンテナンスなど、1つのトランザクションで1つのデータだけ更新するような場合があります。