ロックの待機とタイムアウト

ロックのタイムアウト検出は、ロックが解放されるまで無限にアプリケーションが待機しなくて済むようにするデータベース・マネージャーのフィーチャーです。

例えば、あるトランザクションが別のユーザーのアプリケーションによって保持されているロックを待機しており、一方でそのユーザーがトランザクションをアプリケーションがコミットできるようにロックを解放するということをせずにワークステーションから席をはずしてしまっているかもしれません。 このような場合にアプリケーションが停止しないようにするには、locktimeout データベース構成パラメーターを、アプリケーションがロックを取得するために待機しなければならない最大時間に設定します。

このパラメーターを設定すると、特に分散作業単位 (DUOW) アプリケーションにおいては、グローバル・デッドロックを避けることができます。 ロック要求が保留されている時間が locktimeout 値より大きい場合、エラーが要求側アプリケーションに戻され、そのトランザクションがロールバックされます。 例えば、APPL1 が、既に APPL2 によって保持されているロックを獲得しようとするときにタイムアウトになると、APPL1 は SQLCODE -911 (SQLSTATE 40001) と理由コード 68 を受け取ります。 locktimeout のデフォルト値は -1 です。これは、ロック・タイムアウト検出が無効であることを意味します。

表、行、データ・パーティション、およびマルチディメンション・クラスタリング (MDC) ブロック・ロックの場合、アプリケーションは CURRENT LOCK TIMEOUT 特殊レジスターの値を変更することによって、locktimeout 値をオーバーライドできます。

ロック・タイムアウトに関するレポート・ファイルを生成するには、DB2_CAPTURE_LOCKTIMEOUT レジストリー変数を ON に設定します。 このロック・タイムアウト・レポートに含まれる情報には、ロックのタイムアウトの原因となったロック競合に関係した主なアプリケーション、およびロックに関する詳細 (ロック名、ロック・タイプ、行 ID、表スペース ID、および表 ID など) に関する情報が含まれます。 この変数は推奨されておらず、将来のリリースで除去される可能性があることに注意してください。それは、ロック・タイムアウト・イベントを収集するための、CREATE EVENT MONITOR FOR LOCKING ステートメントを使用する新しい方法があるためです。

ロック要求タイムアウトに関する詳細情報を db2diag ログ・ファイルに記録するには、 diaglevel データベース・マネージャー構成パラメーターの値を 4 に設定します。 ログに記録される情報には、ロックされたオブジェクトの名前、ロック・モード、およびロックを保持しているアプリケーションが含まれます。 また、現行の動的 SQL または XQuery ステートメントまたは静的パッケージ名もログに記録されている可能性があります。 動的 SQL または XQuery ステートメントは、diaglevel が 4 の場合にのみログに記録されます。

ロック待機およびロック・タイムアウトに関する追加情報は、ロック待機情報システム・モニター・エレメントまたは db.apps_waiting_locks ヘルス・インディケーターから取得できます。