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