トランザクション処理および分散コンピューティングにおいて、補償トランザクションとは、以前にコミットされたトランザクションの効果を逆転させるトランザクションのことです。これは、従来のACIDトランザクションが実現不可能または実用的でないシナリオにおいて、複数のサービスやデータベース間でデータの一貫性を維持するために使用される、サガ設計パターンの中核概念です。
複数の個別トランザクションで構成されるビジネスプロセスにおいて、1つ以上のステップが正常に完了(コミット)した後に失敗した場合、補償トランザクションが必要となります。未コミットの変更を破棄するデータベースロールバックとは異なり、補償トランザクションは、完了したトランザクションの作業を意味的に取り消すためのビジネスロジックを適用する新しいトランザクションであり、システムを一貫性のある状態に復元します。
ビジネスプロセスの実行には、多くの場合、単一の原子単位として扱う必要がある一連の操作が含まれます。従来のデータベーストランザクションはコミットとロールバックのメカニズムでこの原子性を実現しますが、このアプローチは複雑で長時間実行されるプロセスには不十分な場合が多いです。[ 1 ]
補償トランザクションは、元の操作の論理的な逆操作を実行することで機能します。たとえば、元のトランザクションが「口座から100ドル引き落とし」だった場合、その補償トランザクションは「口座から100ドル貸し出し」になります。長時間実行されるプロセスでは、各ステップに対応する補償トランザクションを設計する必要があります。プロセスが途中で失敗した場合、システムはそれまでに完了したすべてのステップの補償トランザクションを逆順に実行して、プロセスを元に戻します。
補償トランザクションは、分散型システムや複雑なシステムにおいて一貫性を維持するための重要なパターンである。
補償トランザクションは、サガパターンの根幹を成す要素です。サガとは、各トランザクションが単一のサービス内のデータを更新し、イベントを発行する一連のローカルトランザクションのことです。ローカルトランザクションが何らかの理由で失敗した場合、サガは一連の補償トランザクションを実行して、先行するローカルトランザクションによって行われた変更を元に戻します。
このパターンは、フライト、ホテル、レンタカーの手配を含む旅行予約プロセスなど、長期間にわたるプロセスに不可欠です。これらの操作は長期間にわたり、複数の独立した Web サービスが関与する可能性があるため、データベース ロックを保持することは非現実的です。代わりに、各サービスはトランザクションをコミットし、後続のステップが失敗した場合に備えて補償トランザクションを用意します。これは、リソースを長期間ロックすることを回避するため、2 フェーズ コミット プロトコルを使用する分散トランザクションとは異なります。 [ 2 ]
グローバルなコミット/ロールバックメカニズムが利用できないシステム(レガシーシステム、サードパーティAPI、非トランザクションデータストアを統合するシステムなど)では、失敗した操作を手動で取り消す必要があります。補償トランザクションは、この「取り消し」ロジックのための正式な構造を提供します。このコンテキストでは、このロジックは回避策であり、システムアーキテクトが明示的に設計および実装する必要があり、補償トランザクション自体が失敗する可能性についても計画する必要があります。[ 3 ]
補償トランザクションは、サービス指向アーキテクチャ(SOA)の一部としてビジネスプロセスに参加するWebサービスに組み込まれることがよくあります。ビジネスプロセス実行言語(BPEL)などの標準規格には、ビジネスプロセス定義内で補償ロジックを定義するための規定が含まれており、複雑な複数サービス間の相互作用における障害を自動的に処理することが可能です。
強力な補償パターンではあるものの、限界もある。
これらの課題のため、補償トランザクションは元の状態への完全な復帰を保証するものではなく、ビジネスの観点から意味的に一貫性のある状態への復帰を保証するものである。[ 4 ]