IBM Support

[Db2] Statement.executeQuery や Command.ExecuteReader がロック・タイムアウトや照会タイムアウトしないことがある

Question & Answer


Question

Java アプリケーションの Statement.executeQuery や .NET アプリケーションの Command.ExecuteReader、組み込み SQL の OPEN <カーソル名> がロック・タイムアウトや照会タイムアウトしないことがあります。

どうすればタイムアウトできますか?

Cause

Statement.executeQuery などは、照会実行時にカーソルのオープンを要求します。
Db2 はカーソル・ブロッキング (行ブロッキング) が有効な場合、カーソルのオープンと同時に対象行のフェッチを要求しますが、カーソル・ブロッキングが無効な場合はフェッチを行わなず、即座に制御をアプリケーションへ返します。

このため、カーソル・ブロッキングが無効な場合は対象表や行がロックされていたり、実行に時間のかかる照会でもタイムアウトしないことがあります。

実証例:

  1. SAMPLE データベースの LOCKTIMEOUT を 20 秒に設定します。
    $ db2 get db cfg for sample | grep LOCK
    Lock timeout (sec) (LOCKTIMEOUT) = 20
  2. コマンド行プロセッサー (CLP) から ORG 表を排他モードでロックします。
    $ db2 connect to sample
    $ db2 +c lock table org in exclusive mode
  3. Db2 に付属の JDBC テスト・プログラムから ORG 表を照会します。これはロック・タイムアウト (SQL0911N rc=68) が返ります。
    $ java com.ibm.db2.jcc.DB2Jcc -url "jdbc:db2://localhost:50000/SAMPLE" -user db2inst1 -password passw0rd -sql \'select deptname from org\'
    
    [jcc][10521][13706]Command : java com.ibm.db2.jcc.DB2Jcc -url jdbc:db2://localhost:50000/SAMPLE -user db2inst1 -password ******** -sql 'select deptname from org'
    [jcc][10516][13709]Test Connection Successful.
    [jcc][10515][13711]Execution of SQL failed with error code -911.
    Exception:
    com.ibm.db2.jcc.am.SqlTransactionRollbackException: DB2 SQL Error: SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68, DRIVER=3.69.24
  4. 同じプログラムから ORG 表を FOR UPDATE つきで照会します。カーソル・ブロッキングが無効なため executeQuery でロック・タイムアウトしません。
    $ java com.ibm.db2.jcc.DB2Jcc -url "jdbc:db2://localhost:50000/SAMPLE" -user db2inst1 -password passw0rd -sql \'select deptname from org\'
    [jcc][10521][13706]Command : java com.ibm.db2.jcc.DB2Jcc -url jdbc:db2://localhost:50000/SAMPLE -user db2inst1 -password ******** -sql 'select deptname from org for update'
    [jcc][10516][13709]Test Connection Successful.
    
    

Answer

アプリケーションで使用する照会 SQL を、カーソル・ブロッキングを行えるように書き換えてください。
特に FOR UPDATE で更新意図を宣言した場合はブロッキングを行わないため、更新意図ロックを要求しながらブロッキングを行う場合は USE AND KEEP UPDATE LOCKS に置き換えてください。

  • カーソル・ブロッキング無効
    select * from table for update
  • カーソル・ブロッキング有効
    select * from table use and keep update locks

関連情報
効率的な SELECT ステートメント
オーバーヘッド削減のための行ブロッキングの指定
パスポート・アドバンテージによく寄せられる質問
 

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと 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":"a8m0z0000001gNyAAI","label":"Runtime"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
15 August 2023

UID

ibm10734779