200,000ユーロをある銀行口座から別の銀行口座に振り込むことを想像してください。送金元の口座からその金額を引き出し、送金先の口座に入金します。ここまではすべて正常で、完璧な世界ではこの操作は成功します。しかし、現実の世界では、残念ながらうまくいかないことがある。何かが起きて、お金が失われてしまうのです。それはとても残念なことです。
しかし、トランザクションは、お客様のアプリケーションでこのようなことが起こらないようにするために存在します。このブログでは、トランザクションの用途と重要性、そしてトランザクションがどのようにあなたのビジネスを救うかを示すいくつかのシナリオについて詳しく説明する。
トランザクションとは何か?
ドキュメントによると
トランザクションは、プロセス内でデータベースに対して行われる一連の関連データの変更である。トランザクションは、その有効性が確認されるまで、データベースに永久に保存されることはありません。トランザクションがキャンセルされたり、何らかの外部イベントによって完了しなかった場合、変更は保存されません。
注意しなければならないのは
入れ子になったトランザクションを使用する場合、各サブトランザクションの結果は、上位のトランザクションの検証またはキャンセ ルに依存します。上位のトランザクションが検証された場合、サブトランザクションの結果が確認されます (検証またはキャンセル)。一方、上位トランザクションがキャンセルされると、それぞれの結果に関係なく、すべてのサブトランザクションがキャンセルされます。
トランザクションについてのより詳細な情報は、必ずドキュメントをご覧ください。
トランザクションの使用
トランザクションを使わないビジネス・アプリケーションを想像するのは難しいですが、それでも時折、私はそれを見てきましたアプリケーション開発者とこのトランザクションの欠如について議論するとき、「ああ、これまではうまくいっていたのに」とか、「私たちはいつも運が良かった」というようなフレーズを耳にしたことがあります。私の考えでは、運はビジネス・アプリケーションの設計概念であってはならないのです。
トランザクションを使用する典型的な例として 、会計があります。財務諸表は、資産と負債という2つのカテゴリーの記録を提供します。どちらも計算し、(部分的にではなく、完全に)保存する必要があり、あるいは全く手をつけないこともできます。
他の例としては、出荷システムがあり、注文の作成により倉庫の在庫が減少する。運に頼るのではなく、注文と在庫記録の両方が一緒に作成または変更されるようにする必要があります。何が起こっても、両方のオペレーションが完了するか、キャンセルされるかのどちらかです。
トランザクションは一種の大きな括弧と考えることができる。
- トランザクションを開く (START TRANSACTIONコマンド) を実行します。
- トランザクションは大きな括弧のようなものだと考えることができます:データベースでの操作(1つまたは複数のテーブルからのレコードの作成/変更/削除)を実行します。
- を開き、それを閉じるには、検証 (VALIDATE TRANSACTIONコマンド)を検証するか、あるいはキャンセル(CANCEL TRANSACTIONコマンド)することで閉じます。
低レベルのデータベース操作の他に、トランザクションを利用するのに適したケースとして、ユーザーインターフェイスがあります。例えば、請求書の入力フォームで、商品項目(別のテーブルに格納されている)のリストボックス(またはサブフォーム)を使用する場合、顧客とコンタクト、またはコンタクトと電話番号を想像してください。リストは延々と続きます…。
ユーザが請求書を変更したいとします。1つまたはいくつかの項目を変更し、最終的にキャンセルボタンをクリックして、すべての請求書項目の変更が取り消される(保存されない)と仮定することを決定するかもしれません。これを複雑な配列で処理することもできますし、単純にトランザクションを使用することもできます。
すでにトランザクションを使用していることを祈ります。
ネストされたトランザクションの使用
シナリオ1:連絡先アプリケーション
例えば、customersとcontactsの2つのテーブルからなるシンプルな構造を持っているとします。顧客入力フォームには、連絡先レコードのリストボックスがあります。レコードをダブルクリックすると、連絡先の入力フォームが開き、その連絡先の詳細が表示されます。
ここで、次のようなことが起こるかもしれません。
- エンドユーザーが顧客レコードを開き、通り名を変更します。
- 次に、連絡先「A」を開き、生年月日を変更し、「OK」ボタンをクリックして連絡先フォームを閉じます。
- 続いて、連絡先「B」を開き、何かを変更した後、変更をキャンセルすることにします。
- ここで顧客フォームに戻り、エンドユーザーは「OK」ボタンをクリックして活動を完了します。
ユーザーは、連絡先 ‘A’ の変更が保存され、連絡先 ‘B’ の変更が保存されないことを期待します。もちろん、顧客レコード自体への変更も保存される必要があります。
ネストされたトランザクションを使用すると、これは簡単に処理されます。単に、顧客フォームで1つのトランザクションを使用し、コンタクトフォームで別のトランザクションを使用します。簡単ですね。
シナリオ2:自動バッチ処理
全く別のシナリオですが、同じコンセプトで、自動バッチ処理(計算、インポートなど)があります。
- 複雑なバッチ処理の途中で、何らかの理由で処理を停止する必要があります(例:不良データやユーザーからのキャンセル/終了要求があった場合など)。
シングルレベルトランザクションでは、全ての処理をキャンセルするか、途中で止めるかしかなく、結果として不明瞭な状況になってしまう。途中で止めるわけがない、操作を終えてから止めればいい」と思うかもしれません。それはいいのですが、停電やクラッシュ、ハードウェア障害など、予期せぬエラーにどう対処するのでしょうか?
できないから……運を当てにしても当てにならないから……データの信頼性を確保するためのシステム設計が必要なのです。
覚えておいてください…
トランザクションは、このような状況をコントロールすることができます。トップレベルのトランザクションの中に入れ子になった個々のトランザクション(データのインポート、計算の実行など)を使用します(すべての操作をキャンセルまたは検証できるようにするため)。
何らかの理由(クラッシュ、停電など)でトランザクションが完了しなかった場合でも、心配は無用です。なぜなら、トップレベル・トランザクションではまだ何も検証されていないからです。