分散トランザクション(2PC・Saga)とは?複数のサーバーにまたがる処理をまとめて正しく扱うしくみ

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

分散トランザクションとは(全体像)

分散トランザクションは、何台ものサーバーにまたがる処理を「全部成功」か「全部なかったこと」にしたいときのしくみだよー。でも、相手が複数いると足並みをそろえるのが難しいのー。

身近にたとえると、複数のお店が関わる合同イベントの段取り。「みんな準備できた?」と確認してから始めたり、途中でダメになったら「やったことを取り消す段取り」をしたりするよー。

押さえるのは、2PC(足並みをそろえる)Saga(失敗したら反対操作で埋め合わせる)の2つだよー。


詳しく:2PCのブロッキングとSagaの補償だけ覚えれば戦える

ここが記事の心臓部。まず2PCを見ていこーね。

2PC(2相コミット)

段階内容
準備(Prepare)全員に「準備できた?」と聞く
確定(Commit)全員OKなら一斉に確定する

2PCは、まず全員に「準備できた?」と確認し、全員OKなら一斉に確定するやり方だよー。

ここで一番のひっかけが「2PCは必ず安全」という思い込み。2PCには「ブロッキング問題」がある——確認の途中で誰かが止まると、ほかの全員が待たされてしまうことがあるのー。だから「必ず安全」ではないよー。

次に、マイクロサービス向けのSaga

Saga(補償トランザクション)

項目内容
やり方各サービスで順に処理を進める
失敗したらこれまでの処理を「反対の操作(補償)」で埋め合わせる

ここで2つめのひっかけが「Sagaはきれいなロールバック(巻き戻し)」という誤解。Sagaは、すでに確定した処理を「反対の操作(補償トランザクション)」で埋め合わせるものだよー。たとえば「在庫を減らした」を取り消すなら「在庫を戻す」という反対操作を実行するのー。完全に無かったことにする巻き戻しとは違うよー。

なお、厳密なACIDをあきらめて「いずれ一致すればよい」とするのが結果整合性で、可用性を優先する考え方だよー。

わかりやすく言い換えると

要するに、合同イベントの段取りでイメージするとラクだよー。

2PC … 「みんな準備OK?」→全員OKなら一斉に始める(でも誰か止まると待たされる)

Saga … 順に進めて、失敗したら「やったことの反対」をして埋め合わせる

結果整合性 … 今すぐ完全一致でなく、いずれ一致すればよしとする(可用性優先)

つまり、「2PCはブロッキング問題あり」「Sagaは補償=反対操作で埋め合わせ」、この2点が試験の急所なのー。


試験のツボ

🔴 一番出る:2PC(2相コミット)

①準備(全員に準備OK?と確認)→確定(全員OKなら一斉に確定)

②ブロッキング問題がある(途中で誰か止まると待たされる・必ず安全ではない)

🔴 次に出る:Saga

①マイクロサービス向けで、各サービスで順に処理を進める

②失敗したら反対の操作(補償トランザクション)で埋め合わせる

🟡 押さえると安定:結果整合性

①厳密なACIDをあきらめて「いずれ一致すればよい」とする

②可用性(止まりにくさ)を優先する考え方


よくある間違い

「2PCは必ず安全で、止まることはない」→ ✗  2PCにはブロッキング問題があり、途中で誰か止まると待たされることがある。

「Sagaはきれいなロールバック(巻き戻し)である」→ ✗  Sagaは反対の操作(補償トランザクション)で埋め合わせる。完全な巻き戻しではない。

「分散トランザクションは1台のサーバーの中だけの話である」→ ✗  複数のサーバーやサービスにまたがる処理のこと。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(2PC)

📝 オリジナル問題 1 2PC(2相コミット)

2PC(2相コミット)に関する次の記述のうち、正しいものはどれか。

  1. 2PCは画面を必ず2つに分割して表示するための設定のことだとされているものである
  2. 2PCはデータを必ず暗号化してから2回保存するための命令のことだとされているものである
  3. 2PCは準備(全員に準備OKか確認)と確定(全員OKなら一斉に確定)の2段階で進める
  4. 2PCは音を必ず2回鳴らして知らせるための機能のことだとされているものである
データスラ
データスラ 解答・解説

解答は 3 だよー。

2PCは、準備(全員に「準備OK?」と確認)→確定(全員OKなら一斉に確定)の2段階で進めるやり方なのー。合同イベントで「みんな準備できた?」と聞いてから始める感じだよー。

選択肢1の「2つに分割」、選択肢2の「暗号化して2回保存」、選択肢4の「2回鳴らす」はどれも誤りなのー。

選択肢判定理由
1画面を分割する設定ではない
2暗号化の命令ではない
3準備→確定の2段階で進める
4音を鳴らす機能ではない

オリジナル問題2(2PCのブロッキング)

📝 オリジナル問題 2 2PCのブロッキング問題

2PCの注意点に関する次の記述のうち、正しいものはどれか。

  1. 2PCは必ず安全で、途中で誰が止まってもまったく待たされることはないものだとされている
  2. 2PCにはブロッキング問題があり、途中で誰か止まるとほかの全員が待たされることがある
  3. 2PCはデータを必ずすべて削除するための専用の命令のことだとされているものである
  4. 2PCは画面の明るさをこまかく決めるための専用の設定のことだとされているものである
データスラ
データスラ 解答・解説

解答は 2 だよー。

2PCにはブロッキング問題があって、確認の途中で誰か止まると、ほかの全員が待たされることがあるのー。だから「必ず安全」ではないんだよー。

選択肢1の「必ず安全」、選択肢3の「削除する命令」、選択肢4の「明るさの設定」はどれも誤りなのー。

選択肢判定理由
1ブロッキング問題がある
2誰か止まると全員待たされることがある
3削除する命令ではない
4明るさの設定ではない

オリジナル問題3(Saga)

📝 オリジナル問題 3 Saga

Sagaに関する次の記述のうち、正しいものはどれか。

  1. Sagaは失敗したとき、反対の操作(補償トランザクション)で埋め合わせるしくみである
  2. Sagaは失敗したとき、すべてをきれいに完全な巻き戻しで消すものだとされているものだ
  3. Sagaは画面を必ず点滅させるための専用の設定のことだとされているものである
  4. Sagaはデータを必ず暗号化するための専用の命令のことだとされているものである
データスラ
データスラ 解答・解説

解答は 1 だよー。

Sagaは、失敗したときに、反対の操作(補償トランザクション)で埋め合わせるしくみなのー。「在庫を減らした」を取り消すなら「在庫を戻す」を実行する感じだよー。完全な巻き戻しとは違うよー。

選択肢2の「完全な巻き戻し」、選択肢3の「点滅させる」、選択肢4の「暗号化」はどれも誤りなのー。

選択肢判定理由
1反対操作(補償)で埋め合わせる
2完全な巻き戻しではない
3点滅させる設定ではない
4暗号化の命令ではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る