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语句,但由于相同的原因,它也过于失败。

请帮我理解这个问题的原因。

+0

你还在运行什么其他更新?是否有更新的表会有一个外键引用'PRIM_ID'?如果这是唯一的更新,你是否确信你的多线程代码不会将同一个ID分配给多个线程? –

+0

@MickMnemonic,没有FK对PRIM_ID的引用。我最近注意到的另外一点是在AWR报告中在这张桌面上出现ITL等待。我正在为它优化INITRANS和PCTFREE参数。谢谢你的帮助。 –

+0

并行化代码怎么样,你如何在线程之间分配'PRIM_ID'? –

当多个DML命令试图同时访问相同的数据时,会出现死锁。

Here and here你可以找到关于这个问题的简短解释。这是错误的写入SQL命令的一个非常常见的行为。我认为你应该重写它。

+0

感谢@ HelenA的回应。但正如我所提到的,DML命令没有访问相同的数据。 Prim_id是在更新查询中使用的唯一键。因此,多个线程不能同时访问相同的数据。 –