web-dev-qa-db-ja.com

DB2デッドロックタイムアウトSqlstate:40001、SQLを使用してサーブレットから更新ステートメントが呼び出されたための理由コード68

サーブレットからDB2に更新ステートメントを次々と呼び出しています。エラーsqlstate 40001、理由コード68が発生します。これは、デッドロックタイムアウトが原因であることがわかりました。

  • この問題を解決するにはどうすればよいですか?
  • クエリのタイムアウトを設定することで解決できますか?
  • はいの場合、それをサーブレットの更新ステートメントでどのように使用するか、またはどこで使用するのですか?
11
user1022467

理由コード68は、これがロックタイムアウトによるものであることをすでに示しています(デッドロックは理由コード2です)。アクセスしている同じデータを使用するクエリを同時に実行している他のユーザー、または独自の複数の更新が原因である可能性があります。

まず、db2コマンドラインからdb2pd -db locktest -locks show detailを実行して、ロックの場所を確認します。次に、次のようなものを実行する必要があります。

select tabschema, tabname, tableid, tbspaceid 
from syscat.tables where tbspaceid = # and tableid = #

#記号には、db2pdコマンドの出力から取得したID番号を入力します。

ロックの場所がわかったら、いくつかのヒントを示します。

◦すべてのアプリケーションが共通のデータに同じ順序でアクセスできるようにすることで、デッドロックの頻度を減らすことができます。たとえば、表A、表B、表Cの行にアクセス(したがってロック)します。など。

取得元: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.trb.doc/doc/t0055074.html

推奨読書: http://www.ibm.com/developerworks/data/library/techarticle/dm-0511bond/index.html

補遺:サーブレットまたは他の有罪なアプリケーションがデッドロックに関与していることが判明したselectステートメントを使用している場合は、選択ステートメントに with ur を追加してみてください。新しく更新(または挿入)されたデータは重要ではありません。

12
MrG