IBM Support

[Db2] カタログ表やカタログ・キャッシュによるデッドロック

Question & Answer


Question

ユーザー表に対して SQL や IMPORT/EXPORT を実行した時に、その表に対するロックが取得されていないにも関わらず、デッドロックが発生しました。なぜでしょうか。

Answer

IMPORT や EXPORT は、内部では動的 SQL として処理されます。
動的 SQL は、コンパイル済みのセクションがパッケージ・キャッシュ上にキャッシュされていない場合、SQL のアクセス・プランを作成するためのコンパイルが行われます。

アクセス・プランは統計情報を元に作成されるため、コンパイルの際は、統計情報が保管されているカタログ表や統計情報をキャッシュしているカタログ・キャッシュへアクセスする必要があり、カタログ表への行ロックやカタログ・キャッシュへの内部ロックが取得されます。
これは SQL の実行ではなくコンパイルのために必要なロックであるため、SQL が分離レベル UR で実行される SELECT ステートメントであっても、ロックが取得されます。

このときに、RUNSTATS や再バインド、ALTER TABLE ステートメントなどカタログ表に対して更新を行うような処理が同時に行われていた場合、カタログ表やカタログ・キャッシュへのロックが競合し、ロック待ちやデッドロックが発生することがあります。

たとえば、以下のようなシナリオでデッドロックが発生する可能性があります。
 
  1. SQL のコンパイルを行うトランザクション
    1. カタログ・キャッシュ上のキャッシュ項目に内部カタログ・キャッシュ・ロック (X ロック) を取得。
    2. カタログ表の行に共有ロック (NS ロック) を要求。
    3. 既に排他ロックが保持されているためロック待ち。
  2. カタログの更新を行うトランザクション
    1. カタログ表の行に排他ロック (X ロック) を取得。
    2. カタログ・キャッシュ上のキャッシュ項目に内部カタログ・キャッシュ・ロック (X ロック) を要求。
    3. 既に内部カタログ・キャッシュ・ロックが取得されているためロック待ち。

カタログ表に対してロックを取得するようなメンテナンスの処理は、ロック競合の原因となる可能性がありますので、なるべくアプリケーションによってデータベースが利用されない時間帯に実施してください。
もしアプリケーションで同様のデッドロックが発生した場合は、カタログ表へのロックが解放された後に再実行することで、正常に処理を完了することができます。

関連情報
Deadlocks can occur when running RUNSTATS with ALLOW READ or ALLOW WRITE ACCESS
SQL および XQuery コンパイラーの処理
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m0z0000001kF0AAI","label":"Catalog"},{"code":"a8m500000008PmMAAU","label":"Performance-\u003ELocks"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
26 August 2023

UID

swg21572462