由外键引起的Oracle死锁输出

时间:2018-12-04 16:31:03

标签: oracle database-deadlocks

我们有一个多线程批处理作业,最终陷入僵局。我从dba那里得到了关于实际上导致僵局的原因的矛盾答案。

Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource

错误输出引用了要插入表A的sql。进入表A的每一行都应该是唯一的。表A在其他两个表上都有外键,这两个表都是索引表,主键由两列组成。表A中的许多行可以指向父表中的相同FK。我们的代码通过尝试插入父表然后再次尝试进入表A来处理FK错误。

跟踪日志中的sql引用表A的插入sql(不显示参数绑定值)。这是否绝对意味着要在表A中插入两个相同的sql语句,在这种情况下,我们先前的逻辑在某处不是线程安全的?还是真的有两个插入都引用不满意的FK?死锁是由于我们尝试插入父表中的错误处理而发生的。如果是这样,跟踪中的sql不会再引用父表sql吗?

或者相反,原始插入尝试是否在行上设置了锁,然后在处理了错误之后,第二次插入尝试是否导致了死锁?还有其他调试帮助吗?

1 个答案:

答案 0 :(得分:0)

没有太多信息可使用,但是我猜想是两个线程试图将相同的行同时插入到“其他两个表”之一中。

下的调试思路
  • 在表A和其他两个表(总共3个触发器)上使用触发器,该触发器将插入的数据写入提交的自治事务中的日志记录表中。这样,您可以看到由于死锁而回退的未提交插入(日志表中存在但实际表中不存在的行就是回退的行)。

HTH,KR