更新処理の締めくくりとしてトランザクション処理を行う。.NETの自動トランザクションは強力だが……。最終回。
powered by Insider.NET
前回では、マスタ/詳細テーブルにおける更新処理ということで、リレーションシップが設定されている2つのテーブルのレコードを、整合性を保ちながら追加/更新/削除する手順について解説しました。
具体的には、図1のような構造のデータセットに格納された注文データと注文明細データの編集を、図2のような画面のアプリケーションで行えるようにしました。
テーブル間にはリレーションシップによる外部キー制約が設定されているため、この処理を行う際には、更新するテーブルの順序について考慮する必要があります。つまり、削除処理と追加処理については、次のような順序で行う必要がありました。
ここまでが前回までの内容でした。以上の内容で取りあえずはテーブルの編集が可能ですが、実は万全ではありません。
例えば削除処理において、注文明細テーブルの更新(=レコードの削除)が完了した直後に、コンピュータの電源が抜けてしまった場合を考えてみてください。この場合には注文明細データが削除されたのに、その親データである注文データは削除されません。従って、復旧後には、注文データのみが削除されずにテーブルに残っているという不完全な状況が発生してしまいます。
このようなデータベースの不整合は、どのようなシステムにおいても致命的で、最も避けなければならない状態です。この問題に対処するために、たいていのデータベース・システムには「トランザクション処理」という機能が備わっています。
「トランザクション」とは関連した複数のデータベース処理のことで、「トランザクション処理」はこれらをひとまとめにし、それらの処理が「すべて成功する」か「すべて失敗する」かのいずれかになるように管理する機能です。
トランザクションに含まれるすべての処理が無事に完了した場合には、アプリケーションではトランザクションを「コミット(commit)」します。これによりすべての処理は成功したことになり、その結果はすべてデータベースに反映されます。
もし処理が1つでも失敗した場合には、アプリケーションはトランザクションを「ロールバック(rollback)」できます。これにより、それまでの処理はすべて取り消され、データベースはトランザクションを開始した時点の状態に戻ります。コミットもロールバックもせずにトランザクションが終了してしまった場合には、処理は自動的にロールバックされ、やはりトランザクション内の処理はすべて取り消されます。
先ほどの削除処理の例でいうと、注文明細データの削除処理と注文データの削除処理の2つの処理を1つのトランザクションにします(トランザクションに参加させます)。そして、それぞれのテーブルの更新が完了した場合にのみ、コミットを行います。更新が完了しなかった場合には、ロールバックするか、あるいは、コミットせずにトランザクションを終了すればトランザクションはロールバックされます。ただし、テーブルの更新(Updateメソッドの呼び出し)が失敗するような場合には、何か致命的な、復旧作業が必要となるような問題が起こっているときなので、アプリケーションは異常終了することになると思われます。
いずれにせよトランザクション処理を行っておけば、更新が完了しなかった場合にも、どのデータも削除されていない元の状態(最後に保存された状態)に戻ります。ユーザーは再度作業を行わなければなりませんが、障害によりデータが不完全な状態になることはありません。
トランザクション処理はデータベース・システムの機能ですが、当然ながら、それを制御するためのクラスが.NETのクラス・ライブラリには用意されています。今回はそれについて解説し、前回までに作成したサンプル・アプリケーションにその機能を追加するのが目的ですが、その前に、トランザクションを使わなかった場合のデータベースの不整合を実際に確認してみましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.