Interactive

2相コミット(2PC)可視化

複数のDBにまたがる更新を「全部成功」か「全部取消」にそろえる仕組みが2相コミットです。 ECサイトの注文確定(在庫DB・決済DB・ポイントDB)を題材に、PREPARE→投票→COMMIT/ABORTの流れをシーケンス図で1ステップずつ追えます。 正常系・アボート系に加えて、コーディネータがフェーズ2の途中でクラッシュするとロックが解放されなくなる「ブロッキング問題」も再生できます。

在庫・決済・ポイントの3DBが全員YES → 全員に確定を指示

コーディネータTransaction Manager参加者A在庫DB参加者B決済DB参加者CポイントDB1. PREPARE(在庫を引き当てられるか)2. PREPARE(カードを与信確保できるか)3. PREPARE(ポイントを引当てられるか)4. VOTE YES(在庫DB)5. VOTE YES(決済DB)6. VOTE YES(ポイントDB)7. 判定:全員YES → グローバルコミットを決定8. GLOBAL COMMIT(在庫DBへ)9. GLOBAL COMMIT(決済DBへ)10. GLOBAL COMMIT(ポイントDBへ)11. ACK(在庫DB)12. ACK(決済DB)13. ACK(ポイントDB)14. 完了:トランザクションログをクリア
PREPARE投票判定COMMITABORT / 障害ACK
1 / 14
フェーズ1: PREPAREコーディネータ参加者A

1. PREPARE(在庫を引き当てられるか)

PREPARE tx=8842item=A-1001 qty=1

コーディネータがトランザクションIDを発行し、全参加者に「準備はできているか」を問い合わせる(フェーズ1の開始)。

要点この時点ではまだ何も確定しない。参加者は「実行できる状態」まで用意して待つだけ——ここがフェーズを2段階に分ける理由。

ここが分かる

  • フェーズ1(PREPARE)でYESを返した参加者はロックを取得し、以後は自分の判断でコミットもアボートもできなくなる。コーディネータの指示を待つしかない。
  • 全会一致が条件なので、1参加者のNOだけで全体のアボートが即座に決まる(原子性)。
  • フェーズ2の途中でコーディネータが落ちると、指示を受け取れなかった参加者はコミットかアボートか分からない「in-doubt状態」でロックを保持したまま止まる——これが2PCの代表的な弱点。3PCやSagaパターンはこの問題を緩和するために生まれた。