👉 一言でいうと
「複数の場所(サーバやデータベース)にまたがって、ACID特性を守りながら行うひとかたまりの処理」
普通のトランザクションは 1つのDBの中だけ。
でも実際のシステムでは「AのDBとBのDB」「DBとメッセージキュー」など、複数のシステムにまたがって更新する必要があることが多い。
このときの安全な処理の仕組みが 分散トランザクション です。
生活のたとえ
💳 クレジットカード決済+航空券予約
- 航空会社のシステム:座席の予約を「確保」する
- クレジット会社のシステム:料金を「引き落とす」
→ どちらも成功なら「予約確定」
→ 片方が失敗なら「どちらもなかったことに」しないと困ります。
これを1つにまとめて「全部成功 or 全部失敗」にするのが 分散トランザクション。
具体例(ITシステム)
シナリオ:ネットショップで買い物
- 在庫DB → 商品の数量を1つ減らす
- 決済DB → クレジットカードで支払い処理
- 配送システム → 配送依頼データを登録
これを全部まとめて「1トランザクション」にしたい。
途中で「決済だけ失敗」すると「在庫は減ったのにお金は払われてない」状態になるので大事故。
実現方法:2フェーズコミット(2PC)
分散トランザクションでよく出てくるのが Two-Phase Commit(2PC) という仕組み。
- 準備フェーズ(Prepare)
コーディネータ(管理役)が各システムに「準備できる?」と聞く- 在庫DB「OK、在庫は押さえた」
- 決済DB「OK、引き落とし予約した」
- コミットフェーズ(Commit)
全員が「OK」と答えたら「実行!」と指示
→ 全部反映される
もし誰かが「NG」なら「全部キャンセル」になる
メリットとデメリット
✅ メリット
- 安全:複数システムにまたがっても「全部成功 or 全部失敗」が保証される
⚠️ デメリット
- 処理が重くなる(全員のOKを待つ必要あり)
- ネットワーク障害や1台の故障で「ロックされたまま」になるリスク
- 大規模システムではパフォーマンスが落ちやすい
まとめ
- 分散トランザクション=複数のシステムをまたいでACIDを守る仕組み
- 代表的な実装は 2フェーズコミット
- 例:在庫−決済−配送をまとめて「全部成功/全部失敗」