我们有一个多线程批处理作业,最终陷入僵局。我从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吗?
或者相反,原始插入尝试是否在行上设置了锁,然后在处理了错误之后,第二次插入尝试是否导致了死锁?还有其他调试帮助吗?
答案 0 :(得分:0)
没有太多信息可使用,但是我猜想是两个线程试图将相同的行同时插入到“其他两个表”之一中。
下的调试思路HTH,KR