補償トランザクション
Compensating Transaction
ほしょうとらんざくしょん
すでにコミットした処理の効果を、逆向きの処理を実行して打ち消すトランザクション。複数のサービスやデータベースにまたがる処理を1つのトランザクションとしてロックできないときに、途中で失敗したら、完了済みの処理ごとに用意した補償トランザクション(予約の取消し、返金など)を実行して整合性を取る。Sagaパターンで使われる。
Related
他の資格での定義
すでにコミットした処理の効果を、逆向きの処理を実行して打ち消すトランザクション。複数のサービスにまたがる長い業務処理(Sagaパターン)では全体を1つのトランザクションでロックできないので、途中の処理が失敗したら、完了済みの各処理に対応する補償トランザクション(予約の取消し、返金など)を実行する。元の状態に厳密に戻るとは限らず、その間に他の処理が中間状態を参照し得ることも考慮する。
すでにコミットした処理の効果を、逆向きの処理を実行して打ち消すトランザクション。マイクロサービスのように複数のサービスやデータベースにまたがる業務処理は全体を1つのトランザクションでロックできないので、途中の処理が失敗したら、完了済みの処理ごとに用意した補償トランザクション(予約の取消し、返金など)を実行して整合性を取る(Sagaパターン)。完全に元の状態に戻るとは限らず、途中の状態をほかの処理が参照し得ることも考えて設計する。
Related
関連キーワードの用語
複数のサービスにまたがる処理の整合性を保つため、各サービスの処理をTry(資源の仮押さえと業務上の検査)、Confirm(仮押さえした内容の確定)、Cancel(仮押さえの取消し)の3つの操作に分けて実装する方式。調整役が全サービスにTryを依頼し、すべて成功したらConfirmを、1つでも失敗したらCancelを指示する。2相コミットメントに似た手順を業務処理として実現するもので、データベースのロックを長く持ち続けずに済む。
複数のサービスにまたがる長い業務処理を、サービスごとのローカルトランザクションの連続として実行し、途中で失敗したら、完了済みのローカルトランザクションを補償トランザクションで逆順に打ち消して整合性を取る方式。全体を1つのトランザクションでロックしないので、途中の状態が他の処理から見えることと、結果整合性になることを前提に設計する。各サービスがイベントで連携するコレオグラフィと、調整役が順に指示するオーケストレーションの2つの実装方法がある。
複数のプロセスやトランザクションが共有資源に同時アクセスする際に、データの整合性を保つための制御機構。セマフォ、ミューテックスなどのOS同期機構や、ロック方式(共有ロック・専有ロック)、MVCC等のデータベース制御手法がある。デッドロックの防止も重要な課題。
データベースに対する一連の処理をまとめた論理的な作業単位。「全て実行」か「全て取消」のいずれかで完了し、途中で中断された状態を残さない。ACID特性(原子性、一貫性、独立性、永続性)を満たす必要がある。
トランザクション処理に求められる4つの特性。Atomicity(原子性:全て実行か全て取消)、Consistency(一貫性:整合性の維持)、Isolation(独立性:他のトランザクションの影響を受けない)、Durability(永続性:完了した結果は失われない)。
2つ以上のトランザクションが互いに相手のロック解放を待ち続け、いずれも先に進めなくなる状態。検出時にはいずれかのトランザクションをロールバックして解消する。予防策として資源の獲得順序を統一する方法がある。
