2相ロックとは?意味をわかりやすく簡単に解説
公開:
2相ロックとは
2相ロック(Two-Phase Locking)はデータベース管理システムにおいて、複数のトランザクションが同時実行される際の一貫性を保証する代表的な並行制御プロトコルです。このプロトコルでは、各トランザクションがロックを獲得する成長相(Growing Phase)、ロックを解放する縮退相(Shrinking Phase)の2つのフェーズに分かれて動作します。
トランザクションは一度でもロックを解放した後は、新たなロックを獲得できないという制約を設けることで、直列可能性(Serializability)を実現しています。この手法により、複数のトランザクションが並行実行されても、あたかも順番に実行されたかのような結果を得られます。
成長相と縮退相の動作規則
成長相だと、トランザクションは必要なデータに対して、共有ロック(Shared Lock)または排他ロック(Exclusive Lock)を獲得できますが、一切のロック解放は許可されません。共有ロックは読み取り操作に使用され、複数のトランザクションが同時に同じデータを読み取れますが、排他ロックは書き込み操作に使用され、他のトランザクションによる全てのアクセスをブロックします。
| フェーズ | 許可される操作 | 禁止される操作 |
|---|---|---|
| 成長相 | ロックの獲得のみ可能 | ロックの解放は不可 |
| 縮退相 | ロックの解放のみ可能 | ロックの獲得は不可 |
縮退相に入ると、トランザクションは保持しているロックを順次解放していきますが、新たなロックを獲得することは一切できなくなります。この時点で、トランザクションが必要とする全データへのアクセス権を既に確保している必要があるため、事前に必要なリソースを正確に予測することが求められます。
デッドロックの発生と回避戦略
2相ロックプロトコルでは複数のトランザクションが互いに、相手が保持するロックを待ち続けるデッドロック(Deadlock)が発生する可能性があります。例えば、トランザクションAがリソースXをロックしてリソースYを待ち、トランザクションBがリソースYをロックしてリソースXを待つ状況では、両者とも処理を進められません。
| 回避手法 | 動作原理 | 特徴 |
|---|---|---|
| タイムアウト方式 | 一定時間待機後に中断 | 実装が簡単だが最適ではない |
| 待機グラフ検出 | 循環依存を定期的に検査 | 正確だが検出コストがかかる |
| タイムスタンプ順序 | 古いトランザクションを優先 | デッドロックを事前に防止 |
データベース管理システムは、デッドロックを検出した際に犠牲となるトランザクションを選択してロールバックし、保持していたロックを解放させます。ロールバックされたトランザクションは後で再実行されますが、この過程で処理効率が低下するため、適切なロック順序の設計やタイムアウト値の調整が重要です。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
左へフリックで次のページ、右へフリックで前のページに戻れます左右の矢印ボタン、左右のスワイプで移動できます





