サーブレットからDB2に更新ステートメントを次々と呼び出しています。エラーsqlstate 40001、理由コード68が発生します。これは、デッドロックタイムアウトが原因であることがわかりました。
理由コード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://www.ibm.com/developerworks/data/library/techarticle/dm-0511bond/index.html
補遺:サーブレットまたは他の有罪なアプリケーションがデッドロックに関与していることが判明したselect
ステートメントを使用している場合は、選択ステートメントに with ur
を追加してみてください。新しく更新(または挿入)されたデータは重要ではありません。