2017-09-26 18 views
1

マルチスレッド(通常は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文を使用していましたが、同じ理由で失敗することもありました。

この問題の原因を理解してください。

+0

他にも実行中のアップデートはありますか? 'PRIM_ID'への外部キー参照を持つテーブルの更新はありますか?これが唯一の更新であれば、マルチスレッドコードが複数のスレッドに同じIDを割り当てていないことは確かですか? –

+0

@MickMnemonic、PRIM_IDへのFK参照はありません。私が最近注目したもう一つのポイントは、AWRレポートのこのテーブルに対するITL待機の存在です。私はそれのためのINITRANSとPCTFREEのパラメータを最適化するために取り組んでいます。ご協力いただきありがとうございます。 –

+0

並列化コードはどうですか?スレッド間で 'PRIM_ID'をどうやって配布していますか? –

答えて

0

複数のDMLコマンドが同じデータに同時にアクセスしようとすると、デッドロックが発生します。

Hereおよびhereこの問題について簡単に説明します。間違って書かれたSQLコマンドの非常に一般的な動作です。私はあなたがそれを書き直すべきだと思います。

+0

お返事ありがとうございます、@HelenAしかし、私が言及したように、DMLコマンドは同じデータにアクセスしていません。 Prim_idは、更新クエリで使用される一意のキーです。したがって、複数のスレッドが同じデータに同時にアクセスすることはできません。 –

関連する問題