我有一个 DELETE
语句 delete from test where id = :a
在一个从 Java 调用的包中。每个 session 都试图从同一个表 test
中删除不同的行集,但我仍然收到错误 ORA-00060:WAITING资源时检测到死锁
。
任何可能出现问题的帮助。
我可以在跟踪文件中看到以下内容,但我仍然不明白为什么我会遇到死锁。
*** 2018-08-28 06:55:08.128
DEADLOCK DETECTED ( ORA-00060 )
See Note 60.1 at My Oracle Support for Troubleshooting ORA-60 Errors
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-00049B33-00000000-00000000-00000000 288 2274 SX SSX 320 2566 SX SSX
TM-00049B46-00000000-00000000-00000000 320 2566 SX 142 1851 SX SSX
TM-00049B33-00000000-00000000-00000000 142 1851 SX 288 2274 SX SSX
session 2274: DID 0001-0120-00000406 session 2566: DID 0001-0140-00000019
session 2566: DID 0001-0140-00000019 session 1851: DID 0001-008E-0001311B
session 1851: DID 0001-008E-0001311B session 2274: DID 0001-0120-00000406
Rows waited on:
Session 2274: no row
Session 2566: no row
Session 1851: no row
是否有任何原因不在跟踪文件中显示 ROWID
?
最佳答案
死锁由两个相互锁定的 session 组成,因此 Oracle 必须取消一个事务以防止它们无限期地保持锁定状态。
假设我删除了第 1 项,而你删除了第 2 项,我们都没有提交。
现在我尝试删除项目 2 - 但我不能,因为您未提交的删除正在锁定该行,所以我的 session 在阻塞状态等待您提交或回滚您的删除。
现在您尝试删除项目 1。您不能,因为我未提交的删除仍在锁定该行。现在你被我的session屏蔽了,而我已经被你屏蔽了。 (你需要我提交或回滚,但我不能做,因为我被你阻止了。)两个 session 将永远等待。
Oracle 检测到这种情况并通过取消和回滚其中一个事务、引发 ORA-00060 并将死锁报告写入数据库警报日志来进行干预。
查看警报日志以获取详细信息,并检查您的应用程序逻辑以防止将来发生这种情况。
编辑 - 感谢您发布跟踪详细信息。
session 2274 正在等待 2566(以获取 SSX 模式锁)。
session 2566 正在等待 1851。
session 1851 正在等待 2274。
关于锁定模式的一些注意事项:https://jonathanlewis.wordpress.com/2010/06/21/locks
SSX(share sub exclusive)与'Lock table in share row exclusive mode'
相关联。有时锁及其相关模式并不明显,例如直接路径 insert
到表中,或通过外键进行级联删除(尤其是在子键未索引的情况下)将导致您可能没有预料到的锁定。
这个问题的答案中或许也有一些蛛丝马迹:Finding cause of deadlock error from oracle trace file
关于java - 尝试从表中删除行时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52053773/