ロック・エスカレーション

ロック・エスカレーションとは、粒度の小さい多数のロックを粒度の大きい少数のロックに変換するプロセスです。これにより、並行性が低下しますがメモリー・オーバーヘッドは低減します。

ロック・エスカレーションとは、1 つの表でアプリケーション・プロセスによって保持されている、粒度の小さい多数の行ロック、MDC ロック、LOB ロック、XML ロックを解除し、代わりに表ロックやその他の粒度の大きいロック (モード S または X のブロック・ロック、LOB ロックなど) を獲得する動作です。

ロック・エスカレーションが発生するのは、アプリケーションが MAXLOCKS しきい値を超えるか、データベースが LOCKLIST 制限に近づいた場合です。 データベース・マネージャーは、管理通知ログにメッセージ (AM5500W/ADM5501I) を書き込みます。このメッセージは、ロック・エスカレーションの発生対象の表を特定し、エスカレーションの発生時に実行していたプランまたはパッケージを識別するために役立つ何らかの情報を提供します。

ロック・エスカレーションの利点は、ロック・エスカレーションがなければ SQL0912N エラーで失敗したであろう操作が、ロック・エスカレーションのおかげで正常に終了することです。 ただし、ロック・タイムアウトまたはデッドロックのせいで、依然として操作が失敗することがあります。 欠点として、ロック・エスカレーションは、表へのアクセスが必要になることがある他のアプリケーションとの並行性に悪影響を与えることがあります。

ロック・エスカレーションの回避

ロック・エスカレーションを回避するために、LOCK TABLE ステートメントを使用して表ロックを獲得するようにアプリケーションを変更できます。 この方法は、多数のアプリケーションとユーザーによる同時アクセスが重要ではない表の場合には良い戦略です。

DB2_AVOID_LOCK_ESCALATION レジストリー変数を ON に設定して、ロック・エスカレーションを回避することもできます。 その場合は、ロック要求でアプリケーションが失敗し、SQL0912N エラーが発生します。