我有死锁:sql A正在等待sql B.
<小时/> -----其他等待会议的信息-----
A是:delete from attachment where ID=:1
B是:delete from detail where ID=:1
<小时/> 我的大问题是。为什么这两个sql脚本可能相互等待,但它们在数据库中没有任何共同点?没有任何意义,他们正在等待彼此。
答案 0 :(得分:1)
我建议小心使用的术语:“死锁”具有非常具体的含义(如下),你在问题描述中暗示的是“阻塞锁定”。
僵局是经典的“致命拥抱”问题。如果任务B尝试锁定另一个任务所持有的行,比如任务A,并且任务A正在等待任务B释放锁,则会发生“致命拥抱”。 Oracle将中止其中一个事务以防止永久等待。
根本原因(一般): •等待资源时,事务彼此陷入僵局。 [来自ora docs]
一般解决方案: •通常,这是应用程序中的设计缺陷。 •死锁是一个应用程序问题,必须在应用程序中修复; 没有数据库修复死锁。
死锁将导致Oracle终止其中一个会话,并且该会话将收到指示原因的错误。这种情况会在检测到2到3秒后发生。
另一方面,阻塞锁将无限期地保留,直到阻塞会话提交,回滚或被杀死(执行回滚)。
另外,检查DBMS生成的递归SQL生成的级联操作。