<p>本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">令和4年度 データベーススペシャリスト 午前Ⅱ 問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相ロックプロトコルに関する記述のうち、適切なものはどれか。</p>
<p>ア アンロック(ロック解除)のフェーズでも、必要に応じて新規のロックを獲得できる。
イ 直列可能(シリアライザブル)なスケジュールになることが保証される。
ウ デッドロックが発生しないことが保証される。
エ 任意のトランザクション間で、ロックの順序を固定化するものである。</p>
</blockquote>
<h3 class="wp-block-heading">【解説】</h3>
<p><strong>2相ロックプロトコル(2-Phase Locking: 2PL)</strong>は、データベースの並行制御において、トランザクションの直列可能性を保証するためのプロトコルです。</p>
<p>このプロトコルでは、各トランザクションにおけるロックおよびアンロックの操作を、以下の2つのフェーズ(相)に明確に分離します。</p>
<ol class="wp-block-list">
<li><p><strong>成長相(Growing Phase)</strong>:
必要なロック(共有ロック・専有ロック)を順次獲得していくフェーズ。このフェーズでは、ロックの獲得のみが行われ、一切のアンロック(解除)を行うことはできません。</p></li>
<li><p><strong>収縮相(Shrinking Phase)</strong>:
獲得したロックを順次解除していくフェーズ。一度でもロックを解除(アンロック)すると、そのトランザクションは収縮相に移行し、以後、新たなロックを獲得することは一切禁止されます。</p></li>
</ol>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
stateDiagram-v2
[*] --> Growing_Phase : Transaction_Start
Growing_Phase --> Growing_Phase : Lock_Acquisition
Growing_Phase --> Shrinking_Phase : First_Unlock
Shrinking_Phase --> Shrinking_Phase : Lock_Release
Shrinking_Phase --> [*] : Transaction_End
</pre></div>
<h4 class="wp-block-heading">理論的帰結</h4>
<p>2相ロックプロトコルに従うスケジュールは、数学的に<strong>直列可能(シリアライザブル)</strong>であることが証明されています。直列可能とは、並行して実行した結果が、ある順序で1つずつ順次に(直列に)実行した場合の結果と等しくなる性質を指し、データの整合性を保つために不可欠な要素です。</p>
<p>しかし、2PLは<strong>デッドロックの発生を防止することはできません</strong>。例えば、トランザクションAが資源Xをロックし、トランザクションBが資源Yをロックした状態で、互いに相手の資源をロックしようとすると、どちらも成長相を抜け出せずデッドロックに陥ります。</p>
<h3 class="wp-block-heading">【選択肢の吟味】</h3>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th>選択肢</th>
<th>判定</th>
<th>解説</th>
</tr>
</thead>
<tbody>
<tr>
<td>ア</td>
<td>×</td>
<td>収縮相(ロック解除を行うフェーズ)に移行した後は、いかなる場合も新規のロックを獲得することはできません。</td>
</tr>
<tr>
<td>イ</td>
<td><strong>○</strong></td>
<td>2相ロックプロトコルを遵守することで、スケジュールが必ず直列可能(シリアライザブル)になることが保証されます。</td>
</tr>
<tr>
<td>ウ</td>
<td>×</td>
<td>2PLはデッドロックを防止しません。デッドロックの防止には、静的ロックや資源の順序付けなど別の対策が必要です。</td>
</tr>
<tr>
<td>エ</td>
<td>×</td>
<td>ロックの獲得順序を固定化するルールは含まれていません。順序の固定化は、デッドロックを予防するための別の手法です。</td>
</tr>
</tbody>
</table></figure>
<h3 class="wp-block-heading">【ポイント】</h3>
<ul class="wp-block-list">
<li><p><strong>直列可能性の保証</strong>:2相ロックプロトコル(2PL)の最大の目的であり、遵守すれば必ず直列可能なスケジュールとなる。</p></li>
<li><p><strong>デッドロックは未解決</strong>:2PLを採用してもデッドロックは発生するため、別途「待機グラフ」などを用いた検出と解消が必要。</p></li>
<li><p><strong>2つのフェーズ(相)</strong>:ロック獲得のみの「成長相」と、ロック解除のみの「収縮相」に分かれ、逆戻りはできない。</p></li>
</ul>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
令和4年度 データベーススペシャリスト 午前Ⅱ 問5 2相ロックプロトコル
本問はデータベースの並行制御における2相ロックの性質を問う。解法の核は、デッドロックの可能性と直列可能性の保証を区別することにある。
【問題】
2相ロックプロトコルに関する記述のうち、適切なものはどれか。
ア アンロック(ロック解除)のフェーズでも、必要に応じて新規のロックを獲得できる。
イ 直列可能(シリアライザブル)なスケジュールになることが保証される。
ウ デッドロックが発生しないことが保証される。
エ 任意のトランザクション間で、ロックの順序を固定化するものである。
【解説】
2相ロックプロトコル(2-Phase Locking: 2PL)は、データベースの並行制御において、トランザクションの直列可能性を保証するためのプロトコルです。
このプロトコルでは、各トランザクションにおけるロックおよびアンロックの操作を、以下の2つのフェーズ(相)に明確に分離します。
成長相(Growing Phase):
必要なロック(共有ロック・専有ロック)を順次獲得していくフェーズ。このフェーズでは、ロックの獲得のみが行われ、一切のアンロック(解除)を行うことはできません。
収縮相(Shrinking Phase):
獲得したロックを順次解除していくフェーズ。一度でもロックを解除(アンロック)すると、そのトランザクションは収縮相に移行し、以後、新たなロックを獲得することは一切禁止されます。
stateDiagram-v2
[*] --> Growing_Phase : Transaction_Start
Growing_Phase --> Growing_Phase : Lock_Acquisition
Growing_Phase --> Shrinking_Phase : First_Unlock
Shrinking_Phase --> Shrinking_Phase : Lock_Release
Shrinking_Phase --> [*] : Transaction_End
理論的帰結
2相ロックプロトコルに従うスケジュールは、数学的に直列可能(シリアライザブル)であることが証明されています。直列可能とは、並行して実行した結果が、ある順序で1つずつ順次に(直列に)実行した場合の結果と等しくなる性質を指し、データの整合性を保つために不可欠な要素です。
しかし、2PLはデッドロックの発生を防止することはできません。例えば、トランザクションAが資源Xをロックし、トランザクションBが資源Yをロックした状態で、互いに相手の資源をロックしようとすると、どちらも成長相を抜け出せずデッドロックに陥ります。
【選択肢の吟味】
| 選択肢 |
判定 |
解説 |
| ア |
× |
収縮相(ロック解除を行うフェーズ)に移行した後は、いかなる場合も新規のロックを獲得することはできません。 |
| イ |
○ |
2相ロックプロトコルを遵守することで、スケジュールが必ず直列可能(シリアライザブル)になることが保証されます。 |
| ウ |
× |
2PLはデッドロックを防止しません。デッドロックの防止には、静的ロックや資源の順序付けなど別の対策が必要です。 |
| エ |
× |
ロックの獲得順序を固定化するルールは含まれていません。順序の固定化は、デッドロックを予防するための別の手法です。 |
【ポイント】
直列可能性の保証:2相ロックプロトコル(2PL)の最大の目的であり、遵守すれば必ず直列可能なスケジュールとなる。
デッドロックは未解決:2PLを採用してもデッドロックは発生するため、別途「待機グラフ」などを用いた検出と解消が必要。
2つのフェーズ(相):ロック獲得のみの「成長相」と、ロック解除のみの「収縮相」に分かれ、逆戻りはできない。
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント