補償トランザクション
Compensating Transaction
ほしょうとらんざくしょん
すでにコミットした処理の効果を、逆向きの処理を実行して打ち消すトランザクション。マイクロサービスのように複数のサービスやデータベースにまたがる業務処理は全体を1つのトランザクションでロックできないので、途中の処理が失敗したら、完了済みの処理ごとに用意した補償トランザクション(予約の取消し、返金など)を実行して整合性を取る(Sagaパターン)。完全に元の状態に戻るとは限らず、途中の状態をほかの処理が参照し得ることも考えて設計する。
Related
他の資格での定義
すでにコミットした処理の効果を、逆向きの処理を実行して打ち消すトランザクション。複数のサービスやデータベースにまたがる処理を1つのトランザクションとしてロックできないときに、途中で失敗したら、完了済みの処理ごとに用意した補償トランザクション(予約の取消し、返金など)を実行して整合性を取る。Sagaパターンで使われる。
すでにコミットした処理の効果を、逆向きの処理を実行して打ち消すトランザクション。複数のサービスにまたがる長い業務処理(Sagaパターン)では全体を1つのトランザクションでロックできないので、途中の処理が失敗したら、完了済みの各処理に対応する補償トランザクション(予約の取消し、返金など)を実行する。元の状態に厳密に戻るとは限らず、その間に他の処理が中間状態を参照し得ることも考慮する。
Related
関連キーワードの用語
複数のサービスにまたがる処理の整合性を保つため、各サービスの処理をTry(資源の仮押さえと業務上の検査)、Confirm(仮押さえした内容の確定)、Cancel(仮押さえの取消し)の3つの操作に分けて実装する方式。調整役が全サービスにTryを依頼し、すべて成功したらConfirmを、1つでも失敗したらCancelを指示する。2相コミットメントに似た手順を業務処理として実現するもので、データベースのロックを長く持ち続けずに済む。
複数のサービスにまたがる長い業務処理を、サービスごとのローカルトランザクションの連続として実行し、途中で失敗したら、完了済みのローカルトランザクションを補償トランザクションで逆順に打ち消して整合性を取る方式。全体を1つのトランザクションでロックしないので、途中の状態が他の処理から見えることと、結果整合性になることを前提に設計する。各サービスがイベントで連携するコレオグラフィと、調整役が順に指示するオーケストレーションの2つの実装方法がある。
データの複数のバージョンを保持し、各トランザクションが適切なバージョンを参照する同時実行制御方式。読取りがロックを必要としないため、読取りと書込みが互いにブロックしない。PostgreSQLやOracleが採用。
あるトランザクションがコミットしていないデータを、別のトランザクションが読み取ってしまう現象。READ UNCOMMITTED分離レベルで発生しうる。読み取ったデータがロールバックされると不整合が生じる。
同一トランザクション内で同じデータを2回読み取った際に、他のトランザクションの更新により異なる値が返される現象。READ COMMITTED分離レベル以下で発生しうる。
同一トランザクション内で同じ検索条件でデータを2回読み取った際に、他のトランザクションの挿入・削除により行数が変化する現象。REPEATABLE READ分離レベル以下で発生しうる。SERIALIZABLE分離レベルで防止できる。
