java.sql.SQLException:ORA-00060:在等待资源时检测到死锁
问题描述:
我有一个在多线程(通常是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没有其他指标。我已经浏览了很多可用的博客,他们建议避免使用Bitmap索引。在我的情况下,没有任何位图索引没有涉及任何外键。
注意:我们在条件插入/更新之前使用MERGE语句,但由于相同的原因,它也过于失败。
请帮我理解这个问题的原因。
你还在运行什么其他更新?是否有更新的表会有一个外键引用'PRIM_ID'?如果这是唯一的更新,你是否确信你的多线程代码不会将同一个ID分配给多个线程? –
@MickMnemonic,没有FK对PRIM_ID的引用。我最近注意到的另外一点是在AWR报告中在这张桌面上出现ITL等待。我正在为它优化INITRANS和PCTFREE参数。谢谢你的帮助。 –
并行化代码怎么样,你如何在线程之间分配'PRIM_ID'? –