由外键引起的Oracle死锁输出



我们有一个多线程的批处理作业最终陷入死锁。我从我们的dba那里得到了相互矛盾的答案,究竟是什么导致了僵局。

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

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

跟踪日志中的sql引用了表A中的insert sql(不显示参数绑定值(。这是否确切地意味着有两个相同的sql语句试图插入表A中,在这种情况下,我们之前的逻辑在某个地方不是线程安全的?或者真的有两个插入都引用了一个不满意的FK吗?死锁发生在我们试图插入父表的错误处理中。如果是这样,那么跟踪中的sql是否会不引用父表sql?

或者反常的是,最初的插入尝试是否锁定了该行,然后在处理错误后,第二次插入尝试是否会导致死锁?有进一步的调试帮助吗?

没有太多信息可供使用,但我猜是两个线程试图同时将相同的行插入"另外两个表"中的一个。下调试思路

  • 在表a和其他两个表(总共3个触发器(上使用触发器,这两个表将插入的数据写入提交的自主事务中的日志记录表。通过这种方式,您可以看到由于死锁而回滚的未提交插入(日志记录表中存在但实际表中不存在的行是回滚的行(

HTH,KR

最新更新