データベースおよびトランザクション処理において、2フェーズロック(2PL)は、競合直列化可能性を保証する悲観的並行性制御方式です。[ 1 ] [ 2 ]また、これは結果として得られるデータベーストランザクションスケジュール(履歴)の集合の名前でもあります。このプロトコルは、トランザクションによってデータに適用されるロックを使用し、トランザクションの存続期間中に他のトランザクションが同じデータにアクセスすることをブロック(停止信号として解釈)することができます。
2PLプロトコルでは、ロックは2つのフェーズで適用および解除されます。
基本プロトコルでは、共有ロックと排他ロックの2種類のロックが使用されます。基本プロトコルの改良版では、さらに多くの種類のロックが使用される場合があります。プロセスをブロックするロックを使用する2PL、S2PL、およびSS2PLでは、 2つ以上のトランザクションが相互にブロックされることでデッドロックが発生する可能性があります。
ロックは、直列化可能性を保証するために使用されます。トランザクションがオブジェクトに対してロックを保持しているとは、そのトランザクションが、まだ解放されていないロックをオブジェクトに対して取得している場合を指します。
2PLでは、使用されるデータアクセスロックは読み取りロック(共有ロック)と書き込みロック(排他ロック)のみです。読み取りロックと書き込みロックのルールは以下のとおりです。
すべての競合シリアル化可能なスケジュールはビューシリアル化も可能ですが、その逆は成り立ちません。
2フェーズロックプロトコルによれば、各トランザクションは、トランザクションの実行中に、2つの異なる連続したフェーズでロックを処理します。
2段階ロックのルールは、次のように要約できます。各トランザクションは、ロックを解放した後は、決して新たなロックを取得してはならない。このルールに従うトランザクションを含むスケジュールでは、直列化可能性が保証されます。
通常、フェーズ1の終了時点でトランザクションに関する明示的な知識がない場合、ルールはトランザクションの処理が完了し、コミットが要求されたときにのみ安全に決定されます。この場合、すべてのロックを一度に解放できます(フェーズ2)。
保守的な2相ロック(C2PL)は、トランザクションが実際の実行を開始する前に必要なすべてのロックを取得するという点で、2相ロック(2PL)とは異なります。これは、既にいくつかのロックを保持しているトランザクションが、他のロックを待ってブロックされないようにするためです。C2PLはデッドロックを防ぎます 。
ロック競合が激しい場合、C2PLは2PLやStrict 2PLと比較して、ロックを保持するトランザクションがブロックされないため、ロック保持時間を平均的に短縮します。一方、ロック競合が軽い場合、将来必要となるロックを予測することが難しいため、C2PLは必要以上に多くのロックを保持し、オーバーヘッドが大きくなります。
C2PLトランザクションは、最初の要求で必要なロックをすべて取得できない場合、ロックを取得できません。さらに、各トランザクションは読み取りセットと書き込みセット(読み書きされるデータ項目)を宣言する必要がありますが、これは常に可能とは限りません。これらの制約のため、C2PLはあまり頻繁には使用されていません。
厳密な2相ロック(S2PL)プロトコルに準拠するためには、トランザクションは2PLに準拠し、トランザクションが終了した後(つまり、コミットまたは中止された後)にのみ書き込み(排他)ロックを解放する必要があります。一方、読み取り(共有)ロックは、縮小フェーズ中に定期的に解放されます。
2PLとは異なり、S2PLは厳密性(カスケードレス回復可能性の特殊なケース)を提供します。このプロトコルは、 Bツリーでは常に親ルートから検索を開始するため、ボトルネックを引き起こすことから、 Bツリーには適していません。
または厳密性、または厳密なスケジューリング、または厳密な2相ロック
厳密な2相ロック(SS2PL)に準拠するためには、トランザクションの読み取りロックと書き込みロックは、そのトランザクションが終了した後(つまり、コミットまたは中止された後)にのみ解放されます。SS2PLに準拠するトランザクションは、フェーズ1のみを持ち、トランザクションが完了するまでフェーズ2を持ちません。すべてのSS2PLスケジュールはS2PLスケジュールでもありますが、その逆は成り立ちません。