java - 尝试从表中删除行时出错
问题描述
我在从 Java 调用的包中有一个DELETE
语句delete from test where id = :a
。每个会话都试图从同一个表中删除不同的行集,test
但我仍然收到错误ORA-00060: deadlock detected while waiting for resource
。
任何可能在这里出错的帮助。
我可以在跟踪文件中看到以下内容,但我仍然不明白为什么我会遇到死锁。
*** 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
跟踪文件中显示?
解决方案
死锁由两个相互锁定的会话组成,因此 Oracle 必须取消一个事务以防止它们都无限期地保持锁定状态。
假设我删除了第 1 项,而您删除了第 2 项,我们都没有提交。
现在我尝试删除第 2 项 - 但我不能,因为您未提交的删除正在锁定该行,因此我的会话处于阻塞状态等待您提交或回滚您的删除。
现在您尝试删除第 1 项。您不能,因为我未提交的删除仍在锁定该行。现在你被我的会话阻止了,但我已经被你阻止了。(你需要我提交或回滚,但我不能这样做,因为我被你阻止了。)两个会话都将永远等待。
Oracle 检测到这种情况并通过取消和回滚其中一个事务、引发 ORA-00060 并将死锁报告写入数据库警报日志来进行干预。
检查警报日志以获取详细信息,并查看您的应用程序逻辑以防止将来发生这种情况。
编辑- 感谢您发布跟踪详细信息。
会话 2274 正在等待 2566(以获得 SSX 模式锁定)。
会话 2566 正在等待 1851。
会话 1851 正在等待 2274。
关于锁定模式的一些说明:https ://jonathanlewis.wordpress.com/2010/06/21/locks
SSX(共享子独占)与'Lock table in share row exclusive mode'
. 有时锁及其相关模式并不明显,例如直接insert
进入表的路径,或通过外键的级联删除(尤其是在子键未索引的情况下)会导致您可能没有预料到的锁。
这个问题的答案可能也有一些线索: Finding cause of deadlock error from oracle trace file
推荐阅读
- php - 如何在codeigniter中编辑数据时显示选定的选项
- python - 如何将 3D 点云 (.ply) 转换为网格(带有面和顶点)?
- c++11 - 未找到 C++ Allegro 5 符号:__al_manangled_main 错误
- spring-data-jdbc - spring-data-jdbc 是否考虑提供 JPA ID 生成器之类的注释?
- swagger-ui - 为什么 kubernetes 服务帐户没有访问权限并且无法处理 REST 查询?
- module - 如何编写 use 语句以导入名称但将其用作 mod1::mod2::item?
- reporting-services - 基于 SSRS 中用户安全级别的列可见性
- python - 将日期四舍五入到最接近的半年
- vb.net - 如何模拟鼠标移动并单击Excel工作表中的特定单元格
- php - 是否可以将 PHP 扩展转移到另一台 PC?