ツーフェーズロック
リアルタイムシステムではデッドロックを防ぐことは重要である。また、分散データベースや多重化されたフォールトトレラントシステムでは困難だろう。
Strict 2PL ではデッドロックが以下のような流れで発生する。
G = [ T 1 T 2 X ( A ) X ( B ) X ( B ) X ( A ) ] {\displaystyle G={\begin{bmatrix}T1&T2\\X(A)&\\&X(B)&\\X(B)&\\&X(A)\end{bmatrix}}}
テキストでは以下のようになる T1: X(A) T2:X(B) T1:X(B) T2: X(A)
T1 は T2 が B にかけたロックが外されるのを待ち、T2 は T1 が A にかけたロックが外されるのを待つ。2つのトランザクションはその先に進むことができず、両者共にデッドロック状態になる。
デッドロック問題には汎用の解決策は存在しない。従って、状況に応じて予防/対処するしかない。状況によっては、「銀行家のアルゴリズム」や「ロック獲得順の設定」のような対策によってデッドロックを防ぐこともできる。
厳密なツーフェーズロックよりもさらに厳密な 厳格な(Rigorous)ツーフェーズロックもある。これはトランザクションのコミットの際に共有ロックを含めた全ロックを解放するものである。多くのデータベースは Strict 2PL を使用している。