分散トランザクションとは(全体像)
分散トランザクションは、何台ものサーバーにまたがる処理を「全部成功」か「全部なかったこと」にしたいときのしくみだよー。でも、相手が複数いると足並みをそろえるのが難しいのー。
身近にたとえると、複数のお店が関わる合同イベントの段取り。「みんな準備できた?」と確認してから始めたり、途中でダメになったら「やったことを取り消す段取り」をしたりするよー。
押さえるのは、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)
2PC(2相コミット)に関する次の記述のうち、正しいものはどれか。
- 2PCは画面を必ず2つに分割して表示するための設定のことだとされているものである
- 2PCはデータを必ず暗号化してから2回保存するための命令のことだとされているものである
- 2PCは準備(全員に準備OKか確認)と確定(全員OKなら一斉に確定)の2段階で進める
- 2PCは音を必ず2回鳴らして知らせるための機能のことだとされているものである
解答は 3 だよー。
2PCは、準備(全員に「準備OK?」と確認)→確定(全員OKなら一斉に確定)の2段階で進めるやり方なのー。合同イベントで「みんな準備できた?」と聞いてから始める感じだよー。
選択肢1の「2つに分割」、選択肢2の「暗号化して2回保存」、選択肢4の「2回鳴らす」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 画面を分割する設定ではない |
| 2 | ✗ | 暗号化の命令ではない |
| 3 | ✓ | 準備→確定の2段階で進める |
| 4 | ✗ | 音を鳴らす機能ではない |
オリジナル問題2(2PCのブロッキング)
2PCの注意点に関する次の記述のうち、正しいものはどれか。
- 2PCは必ず安全で、途中で誰が止まってもまったく待たされることはないものだとされている
- 2PCにはブロッキング問題があり、途中で誰か止まるとほかの全員が待たされることがある
- 2PCはデータを必ずすべて削除するための専用の命令のことだとされているものである
- 2PCは画面の明るさをこまかく決めるための専用の設定のことだとされているものである
解答は 2 だよー。
2PCにはブロッキング問題があって、確認の途中で誰か止まると、ほかの全員が待たされることがあるのー。だから「必ず安全」ではないんだよー。
選択肢1の「必ず安全」、選択肢3の「削除する命令」、選択肢4の「明るさの設定」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | ブロッキング問題がある |
| 2 | ✓ | 誰か止まると全員待たされることがある |
| 3 | ✗ | 削除する命令ではない |
| 4 | ✗ | 明るさの設定ではない |
オリジナル問題3(Saga)
Sagaに関する次の記述のうち、正しいものはどれか。
- Sagaは失敗したとき、反対の操作(補償トランザクション)で埋め合わせるしくみである
- Sagaは失敗したとき、すべてをきれいに完全な巻き戻しで消すものだとされているものだ
- Sagaは画面を必ず点滅させるための専用の設定のことだとされているものである
- Sagaはデータを必ず暗号化するための専用の命令のことだとされているものである
解答は 1 だよー。
Sagaは、失敗したときに、反対の操作(補償トランザクション)で埋め合わせるしくみなのー。「在庫を減らした」を取り消すなら「在庫を戻す」を実行する感じだよー。完全な巻き戻しとは違うよー。
選択肢2の「完全な巻き戻し」、選択肢3の「点滅させる」、選択肢4の「暗号化」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 反対操作(補償)で埋め合わせる |
| 2 | ✗ | 完全な巻き戻しではない |
| 3 | ✗ | 点滅させる設定ではない |
| 4 | ✗ | 暗号化の命令ではない |
まとめ
押さえどころ
- 🔴 2PC(2相コミット) = 準備(全員に確認)→確定(一斉に確定)。ブロッキング問題があり必ず安全とは限らない。
- 🔴 Saga = マイクロサービス向け。失敗したら反対の操作(補償トランザクション)で埋め合わせる(完全な巻き戻しではない)。
- 🟡 結果整合性 = 厳密なACIDをあきらめ「いずれ一致すればよい」とする。可用性を優先する考え方。
次に学ぶ
- トランザクションACID ── 信頼の4つの約束。分散では守りきれず、2PCやSagaで折り合いをつける。
- 並行制御(2PL・MVCC) ── 同時実行を正しく保つしくみ。分散でのデータ管理とあわせて押さえる。
執筆: SikakuQuest編集部