<p><!-- style_prompt -->本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">令和5年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問5 2相コミットプロトコル</h1>
<p>分散データベースの整合性を保つ2相コミットプロトコルの動作プロセスと、主サイト・従サイト間の決定ルールを問う問題です。</p>
<h3 class="wp-block-heading">【問題】</h3>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>分散データベースシステムにおいて、2相コミットプロトコルを用いてトランザクションを同期制御する。主サイト(コーディネーター)が全従サイト(コホート)にコミットの準備(Prepare)を要求した後の動作として、適切なものはどれか。</p>
<p>ア 一部の従サイトから否決(VOTE_ABORT)の応答を受け取った場合でも、過半数の従サイトから合意(VOTE_COMMIT)の応答があれば、主サイトはコミットを決定する。
イ すべての従サイトから合意(VOTE_COMMIT)の応答を受け取った場合、主サイトはコミットを決定し、全従サイトへコミット指示(GLOBAL_COMMIT)を送信する。
ウ 従サイトは、主サイトからの準備要求を受信した時点で、ローカルなコミット処理を完全に完了させてから合意応答を返信する。
エ 準備要求送信後、特定の従サイトからの応答が一定時間内にない場合、主サイトは通信障害とみなし、単独でコミットを強行する。</p>
</blockquote>
<h3 class="wp-block-heading">【解説】</h3>
<p>2相コミットプロトコル(Two-Phase Commit Protocol: 2PC)は、分散データベース環境において、複数のノード(サイト)にまたがるトランザクションの原子性(Atomicity:すべて実行されるか、全く実行されないかのどちらかである性質)を保証するためのプロトコルです。</p>
<p>このプロトコルは、以下の2つのフェーズ(相)に分かれて実行されます。</p>
<h4 class="wp-block-heading">1. 第1相:投票フェーズ(Prepare Phase)</h4>
<p>主サイト(調整者)がすべての従サイト(参加者)に対し、コミットの準備が可能かどうかの問い合わせ(Prepare)を送信します。
各従サイトは、自身のローカルな更新処理が問題なく完了できる状態(ログの書き出し完了など)であれば「合意(VOTE_COMMIT)」、不可であれば「否決(VOTE_ABORT)」を主サイトに応答します。</p>
<h4 class="wp-block-heading">2. 第2相:決定フェーズ(Commit Phase)</h4>
<p>主サイトは、すべての従サイトからの応答を回収し、次のルールに基づいて最終決定を下します。</p>
<ul class="wp-block-list">
<li><p><strong>全員が「合意」の場合</strong>:主サイトはコミットを決定し、全員に「コミット指示(GLOBAL_COMMIT)」を送ります。</p></li>
<li><p><strong>1つでも「否決」または「タイムアウト(無応答)」がある場合</strong>:主サイトはロールバックを決定し、全員に「ロールバック指示(GLOBAL_ABORT)」を送ります。</p></li>
</ul>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
sequenceDiagram
autonumber
Participant Coordinator as 主サイト
Participant Cohort as 従サイト
Note over Coordinator, Cohort: Phase 1 (Prepare Phase)
Coordinator ->> Cohort: Prepare
Note over Cohort: Check local state
Cohort -->> Coordinator: VOTE_COMMIT
Note over Coordinator, Cohort: Phase 2 (Commit Phase)
Note over Coordinator: Decision (All Yes)
Coordinator ->> Cohort: GLOBAL_COMMIT
Note over Cohort: Execute commit
Cohort -->> Coordinator: ACK
</pre></div>
<h3 class="wp-block-heading">【選択肢の吟味】</h3>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">選択肢</th>
<th style="text-align:center;">判定</th>
<th style="text-align:left;">解説</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;">ア</td>
<td style="text-align:center;">誤り</td>
<td style="text-align:left;">2相コミットでは、1サイトでも否決(VOTE_ABORT)を返した場合は、過半数に関わらず全体をロールバック(GLOBAL_ABORT)します。</td>
</tr>
<tr>
<td style="text-align:left;"><strong>イ</strong></td>
<td style="text-align:center;"><strong>正解</strong></td>
<td style="text-align:left;">すべての従サイトから合意(VOTE_COMMIT)を得られた場合にのみ、主サイトはコミットを決定し、GLOBAL_COMMITを送信します。</td>
</tr>
<tr>
<td style="text-align:left;">ウ</td>
<td style="text-align:center;">誤り</td>
<td style="text-align:left;">準備要求(Prepare)の段階では、従サイトはコミットできる状態にする(ログへの記録など)だけであり、最終指示があるまでコミットは完了しません。</td>
</tr>
<tr>
<td style="text-align:left;">エ</td>
<td style="text-align:center;">誤り</td>
<td style="text-align:left;">応答が一定時間ない(タイムアウト)場合、主サイトは障害とみなして「ロールバック(GLOBAL_ABORT)」を指示します。強行コミットは行いません。</td>
</tr>
</tbody>
</table></figure>
<h3 class="wp-block-heading">【ポイント】</h3>
<ul class="wp-block-list">
<li><p><strong>全員一致が原則</strong>:1つでも否決やタイムアウトがあれば、全体がロールバックされる(All or Nothingの徹底)。</p></li>
<li><p><strong>2段階のフェーズ</strong>:第1相で「準備(Prepare)と合意(Vote)」、第2相で「最終決定(Commit / Abort)」。</p></li>
<li><p><strong>主従の役割</strong>:主サイト(コーディネーター)が全体の合否を判定し、従サイト(コホート)は自サイトの成否を返す。</p></li>
</ul>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
令和5年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問5 2相コミットプロトコル
分散データベースの整合性を保つ2相コミットプロトコルの動作プロセスと、主サイト・従サイト間の決定ルールを問う問題です。
【問題】
分散データベースシステムにおいて、2相コミットプロトコルを用いてトランザクションを同期制御する。主サイト(コーディネーター)が全従サイト(コホート)にコミットの準備(Prepare)を要求した後の動作として、適切なものはどれか。
ア 一部の従サイトから否決(VOTE_ABORT)の応答を受け取った場合でも、過半数の従サイトから合意(VOTE_COMMIT)の応答があれば、主サイトはコミットを決定する。
イ すべての従サイトから合意(VOTE_COMMIT)の応答を受け取った場合、主サイトはコミットを決定し、全従サイトへコミット指示(GLOBAL_COMMIT)を送信する。
ウ 従サイトは、主サイトからの準備要求を受信した時点で、ローカルなコミット処理を完全に完了させてから合意応答を返信する。
エ 準備要求送信後、特定の従サイトからの応答が一定時間内にない場合、主サイトは通信障害とみなし、単独でコミットを強行する。
【解説】
2相コミットプロトコル(Two-Phase Commit Protocol: 2PC)は、分散データベース環境において、複数のノード(サイト)にまたがるトランザクションの原子性(Atomicity:すべて実行されるか、全く実行されないかのどちらかである性質)を保証するためのプロトコルです。
このプロトコルは、以下の2つのフェーズ(相)に分かれて実行されます。
1. 第1相:投票フェーズ(Prepare Phase)
主サイト(調整者)がすべての従サイト(参加者)に対し、コミットの準備が可能かどうかの問い合わせ(Prepare)を送信します。
各従サイトは、自身のローカルな更新処理が問題なく完了できる状態(ログの書き出し完了など)であれば「合意(VOTE_COMMIT)」、不可であれば「否決(VOTE_ABORT)」を主サイトに応答します。
2. 第2相:決定フェーズ(Commit Phase)
主サイトは、すべての従サイトからの応答を回収し、次のルールに基づいて最終決定を下します。
sequenceDiagram
autonumber
Participant Coordinator as 主サイト
Participant Cohort as 従サイト
Note over Coordinator, Cohort: Phase 1 (Prepare Phase)
Coordinator ->> Cohort: Prepare
Note over Cohort: Check local state
Cohort -->> Coordinator: VOTE_COMMIT
Note over Coordinator, Cohort: Phase 2 (Commit Phase)
Note over Coordinator: Decision (All Yes)
Coordinator ->> Cohort: GLOBAL_COMMIT
Note over Cohort: Execute commit
Cohort -->> Coordinator: ACK
【選択肢の吟味】
| 選択肢 |
判定 |
解説 |
| ア |
誤り |
2相コミットでは、1サイトでも否決(VOTE_ABORT)を返した場合は、過半数に関わらず全体をロールバック(GLOBAL_ABORT)します。 |
| イ |
正解 |
すべての従サイトから合意(VOTE_COMMIT)を得られた場合にのみ、主サイトはコミットを決定し、GLOBAL_COMMITを送信します。 |
| ウ |
誤り |
準備要求(Prepare)の段階では、従サイトはコミットできる状態にする(ログへの記録など)だけであり、最終指示があるまでコミットは完了しません。 |
| エ |
誤り |
応答が一定時間ない(タイムアウト)場合、主サイトは障害とみなして「ロールバック(GLOBAL_ABORT)」を指示します。強行コミットは行いません。 |
【ポイント】
全員一致が原則:1つでも否決やタイムアウトがあれば、全体がロールバックされる(All or Nothingの徹底)。
2段階のフェーズ:第1相で「準備(Prepare)と合意(Vote)」、第2相で「最終決定(Commit / Abort)」。
主従の役割:主サイト(コーディネーター)が全体の合否を判定し、従サイト(コホート)は自サイトの成否を返す。
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント