2相コミットで分散トランザクションの原子性を保証する場合のネットワーク障害【午前2 解説】
要点まとめ
- 結論:調停者がコミットまたはロールバックの決定を参加者に送る直前に障害が起きると、参加者は判断できなくなる。
- 根拠:2相コミットは調停者の決定通知が全参加者に届くことが前提であり、通知前の障害は状態不明を招く。
- 差がつくポイント:調停者の「決定通知送信前」の障害と「問い合わせ送信前」や「応答受信前」の障害の違いを正確に理解すること。
正解の理由
2相コミットでは、調停者が「コミット可否の問い合わせ」を参加者に送り、参加者が応答した後に「コミットまたはロールバックの決定」を通知します。
この決定通知を送る直前に調停者が障害になると、参加者は決定を受け取れず、コミットすべきかロールバックすべきか判断できない状態(不確定状態)に陥ります。
したがって、選択肢イの「調停者のトランザクションが、コミット又はロールバックの決定を参加者に送る直前に障害になった。」が正解です。
よくある誤解
調停者の問い合わせ送信前や参加者の応答前の障害は、参加者が判断できない状態を生じにくいと誤解されがちです。
実際には決定通知の送信前の障害が最も問題となります。
解法ステップ
- 2相コミットの流れを理解する(問い合わせ→応答→決定通知)。
- 各段階で障害が起きた場合の影響を考える。
- 参加者が判断できなくなるのは「決定通知送信前」の障害であることを確認。
- 選択肢の文言を比較し、決定通知送信直前の障害を選ぶ。
選択肢別の誤答解説
- ア: 問い合わせ送信直前の障害は、参加者はまだ決定を受けていないため判断不能にはならず、単に再試行可能。
- イ: 調停者が決定通知を送る直前に障害になるため、参加者は決定を知らず判断できない状態になる。正解。
- ウ: 参加者の応答直前の障害は、調停者が決定を下せないが参加者はまだ判断不要。
- エ: 参加者が完了通知を返す直前の障害は、トランザクションの最終段階であり、判断不能状態とは異なる。
補足コラム
2相コミットは分散トランザクションの原子性を保証する代表的なプロトコルですが、決定通知送信前の障害により「不確定状態(blocking)」が発生しやすい問題があります。
この問題を解決するために3相コミットやPaxosなどのより高度な合意アルゴリズムが提案されています。
FAQ
Q: なぜ調停者の決定通知送信前の障害が特に問題なのですか?
A: 参加者は決定を受け取っていないため、コミットかロールバックか判断できず、トランザクションが停止状態になるからです。
Q: 参加者が応答を返す前の障害は問題にならないのですか?
A: その段階では調停者が決定を下せないため、トランザクションは進行せず再試行可能であり、判断不能状態にはなりにくいです。
関連キーワード: 2相コミット、分散トランザクション、原子性、ネットワーク障害、トランザクション管理