マルチスレッド(通常は16/32)で動作するJavaバッチがあります。条件付きでテーブルに挿入/更新するJDBCクエリがあります。java.sql.SQLException:ORA-00060:リソースの待機中にデッドロックが検出されました
このクエリで[CobolThread 34] ERROR (com.splwg.base.support.sql.PreparedStatementImpl) Error executing update for rawSQL:
update TABLE_A s set s.INT_COL = s.INT_COL + 1 where s.PRIM_ID = ?
with 'string' parameter named 'primId' to : '8741104958' to indices: 1
java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource
は、PRIM_IDの列が主キー列であり、このTABLE_Aには他のインデックスはありません。
しかし、レコードの一部は次のエラーのため失敗します。私はこれを利用して多くのブログを見てきました。彼らが示唆しているのは、ビットマップインデックスの使用を避けることです。私の場合、ビットマップインデックスはありません。また、関連する外部キーもありません。
注:条件付き挿入/更新の前にMERGE文を使用していましたが、同じ理由で失敗することもありました。
この問題の原因を理解してください。
他にも実行中のアップデートはありますか? 'PRIM_ID'への外部キー参照を持つテーブルの更新はありますか?これが唯一の更新であれば、マルチスレッドコードが複数のスレッドに同じIDを割り当てていないことは確かですか? –
@MickMnemonic、PRIM_IDへのFK参照はありません。私が最近注目したもう一つのポイントは、AWRレポートのこのテーブルに対するITL待機の存在です。私はそれのためのINITRANSとPCTFREEのパラメータを最適化するために取り組んでいます。ご協力いただきありがとうございます。 –
並列化コードはどうですか?スレッド間で 'PRIM_ID'をどうやって配布していますか? –