本記事は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つのフェーズ(相):ロック獲得のみの「成長相」と、ロック解除のみの「収縮相」に分かれ、逆戻りはできない。

