ホーム > データベーススペシャリスト試験 > 2011年
データベーススペシャリスト試験 2011年 午前2 問12
分散データベースシステムにおいて, 複数のデータベースを更新する場合に用いられる2相コミットの処理手順として, 適切なものはどれか。ここで、トランザクションの中で実行される処理内容は次のとおりとする。
ア:主サイトが各データベースサイトにコミット準備要求を発行した場合, 各データベースサイトは, 準備ができていない場合だけ応答を返す。
イ:主サイトは, 各データベースサイトにコミットが可能であることを確認した後, コミットを発行する。(正解)
ウ:主サイトは, 各データベースサイトにコミットを発行し, コミットが失敗した場合には, 再度コミットを発行する。
エ:主サイトは, 各データベースサイトのロックに成功した後、コミットを発行し, 各データベースサイトをアンロックする。
解説
2相コミット (Two-Phase Commit) の処理手順と解説
分散データベースシステムにおける2相コミットプロトコルは、複数のデータベースサイト(ノード)でのトランザクション処理の整合性を保ち、全体として一貫性のあるコミットまたはロールバックを保証するための手法です。
2相コミットの概要
2相コミットは文字通り2つのフェーズから成り立っています。
-
準備フェーズ (Prepare Phase)
主サイト(コーディネータ)は各参加サイトに「コミット準備要求(prepare request)」を送信します。各参加サイトはトランザクションをローカルで実行し、その結果トランザクションをコミットして問題ないかを判断します。- 問題なければ「準備OK(vote commit)」を主サイトに返します。
- 問題があれば「コミット不可(vote abort)」を返します。
-
コミットフェーズ (Commit Phase)
主サイトはすべての参加サイトから「準備OK」が返ってきた場合、全体のコミットを指示します。逆にどこかのサイトが「コミット不可」を返した場合は、全体のロールバック(中止)を指示します。
この際、主サイトはコミットまたは中止を各参加サイトに通知し、参加サイトはそれに従って処理を最終決定します。
選択肢の検討
-
ア: 「準備ができていない場合だけ応答を返す」
→ 2相コミットでは、どのような場合でも応答を返し、主サイトは応答を待つ必要があります。応答しない場合はタイムアウトや障害と見なします。誤りです。 -
イ: 「主サイトは、各データベースサイトにコミットが可能であることを確認した後、コミットを発行する」
→ これが正しい処理です。全員がコミット準備OKを返したことを確認してからコミット要求を出します。 -
ウ: 「コミットが失敗した場合に再度コミットを発行する」
→ 失敗したコミットは再実行しても無意味であり、代わりにロールバック等の処理を行います。誤りです。 -
エ: 「ロックに成功した後、コミットを発行し、アンロックする」
→ ロックは通常、準備フェーズで行いますが、コミット指示とロック解除は別々に慎重に行われます。説明としては不正確です。
まとめ
2相コミットの正しい流れは、
- 主サイトが全参加サイトに「コミット準備要求」を送る。
- 各サイトは準備可否を返す。
- 主サイトが全て準備OKを確認した上で「コミット要求」を送る。
- 各サイトでコミットを実行し終了。
このため、選択肢イが正解となります。
参考として2相コミットの簡略化した擬似フロー
主サイト:
全サイトに「Prepare?」を送信
全て"Yes"なら
全サイトに「Commit!」を送信
どれか"No"やタイムアウトなら
全サイトに「Abort!」を送信
各サイト:
「Prepare?」受信
トランザクション準備 → 問題なければ"Yes", 問題あれば"No"を返す
「Commit!」受信 → コミット実行
「Abort!」受信 → ロールバック実行
これにより、分散環境でも整合性のあるトランザクション処理が実現できます。