【ぶんさんとらんざくしょん】
分散トランザクション とは?
最終更新:
💡 離れたデータの更新を、ひとつの取引として調整
複数のデータベースなどにまたがる処理を、一つのトランザクションとして調整する仕組み。2フェーズコミットなどで、参加者の確定・取り消しを協調させる。
📌 このページのポイント
普通のトランザクションとは、何が違う?
複数のデータベースなどにまたがる点だよ。たとえば別々のDBにある注文と在庫を更新するなら、片方だけ確定して困らないように調整する必要がある。一つのDBの中だけで行う場合より、通信や障害への対処が難しくなるんだ。
2フェーズコミットは、どう進むの?
調整役が参加者へ、まず確定できるよう準備する指示を出す。全員が準備できたら、確定する決定を伝える。準備段階で進められない場合は取り消す。この二段階で、全体として確定するか取り消すかをそろえるんだ。
全員が同じ瞬間に書き込むの?
同時刻に更新する意味ではないよ。同じ確定・取り消しの決定に従う仕組みなんだ。通信や調整役に問題が起きると、参加者が準備したまま決定を待つことがある。たとえばPostgreSQLでも、準備済みの状態が長く続く可能性を説明しているよ。
Sagaなら、同じように全部を元に戻せる?
Sagaは各サービスで個別のトランザクションを確定しながら進め、必要に応じて補償処理を行う考え方だよ。予約の取消のように、確定した操作の影響を打ち消す別の処理を行う。元のデータ状態への完全な復元や、必ず逆順での処理が保証されるわけではないんだ。
どちらを使うかは、どう考えるの?
必要な整合性、各DBやサービスの対応、途中の状態が見えてもよいか、失敗時に補償できるかを考えるよ。Sagaの補償そのものも失敗することがあるので、進捗の記録や再実行、必要なら人による復旧まで設計する。名前だけで選べる万能な方式ではないんだ。
まとめ:ざっくりこれだけ覚えればOK!
「分散トランザクション」って出てきたら「複数の場所の更新をひとつの取引として調整すること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Distributed Transaction」 = 分散トランザクション
💬 Distributed(分散した)+Transaction(取引・処理一塊)。複数の場所に分散したデータを1つの取引として扱う仕組みだよ