分散トランザクション
Distributed Transaction_
分散システムにおけるtransactionのこと
複数システムにまたがる処理を、整合性を保つために、全体で1つのトランザクションとする必要がある
gpt-5.icon
1. なぜ必要か
単一DBのトランザクションでは ACID を保証できますが、マイクロサービスや複数DB環境では以下が問題になります。
処理が 複数システムに分散
一部だけ成功・一部失敗すると 不整合 が発生
ネットワーク障害・部分障害が常に起こり得る
2. 基本的な考え方
分散トランザクションでは以下を目指します。
全体として成功 or 全体として失敗
途中失敗時に ロールバック or 補償
ただし、単一DBのように簡単にはいきません。
3. 代表的な方式
①2PC
最も古典的な方式。
流れ
1. Prepareフェーズ
各参加者に「コミットできるか?」を確認
2. Commitフェーズ
全員OK → コミット
誰かNG → 全員ロールバック
② Saga パターン(実務で主流)
ロールバックではなく「Compensating Transaction」を使う。
考え方
処理を小さなLocal Transactionに分割
失敗したら「逆操作」を順に実行
例:
1. 注文作成(成功)
2. 在庫確保(成功)
3. 決済(失敗)
→ 在庫解放 → 注文キャンセル
③ 最終的整合性(Eventual Consistency)
「常に即時一致しなくてよい」前提
非同期イベントで状態を揃える
よくある技術
メッセージキュー
イベントソーシング
冪等設計
4. CAP定理との関係
分散システムでは同時に以下3つは満たせません。
C: 一貫性(Consistency)
A: 可用性(Availability)
P: 分断耐性(Partition tolerance)
分散トランザクションでは多くの場合、
A + P を優先
C は最終的整合性で妥協
という選択になります。