Java 尝试从表中删除行时出错

Java 尝试从表中删除行时出错,java,oracle,plsql,oracle-adf,Java,Oracle,Plsql,Oracle Adf,我在从Java调用的包中有一个DELETE语句deletefromtest,其中id=:a。每个会话都试图从同一个表中删除不同的行集test,但我仍然收到错误ORA-00060:在等待资源时检测到死锁 任何人都知道这里可能出了什么问题 我可以在跟踪文件中看到下面的内容,但我仍然无法理解为什么会出现死锁 ***2018-08-2806:55:08.128 检测到死锁(ORA-00060) 有关ORA-60错误的疑难解答,请参见我的Oracle支持中的注释60.1 [事务死锁] 以下死锁不是ORAC

我在从Java调用的包中有一个
DELETE
语句
deletefromtest,其中id=:a
。每个会话都试图从同一个表中删除不同的行集
test
,但我仍然收到错误
ORA-00060:在等待资源时检测到死锁

任何人都知道这里可能出了什么问题

我可以在跟踪文件中看到下面的内容,但我仍然无法理解为什么会出现死锁

***2018-08-2806:55:08.128
检测到死锁(ORA-00060)
有关ORA-60错误的疑难解答,请参见我的Oracle支持中的注释60.1
[事务死锁]
以下死锁不是ORACLE错误。这是一个
应用程序设计中的用户错误导致死锁
或发出不正确的即席SQL。以下
信息可能有助于确定死锁:
死锁图:
---------阻拦者------------服务员---------
资源名称进程会话保持等待进程会话保持等待
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
第2274课时:DID 0001-0120-00000406课时2566:DID 0001-0140-00000019
第2566课时:DID 0001-0140-00000019课时1851:DID 0001-008E-000131B
会议1851:DID 0001-008E-000131B会议2274:DID 0001-0120-00000406
等待的排数:
会话2274:无行
第2566节:无行
第1851课时:无行

没有在跟踪文件中显示
ROWID
有什么原因吗?

此时,当您试图删除行时,另一个进程似乎正在同时访问这些行。第一个进程锁定这些行。这被称为“竞争条件”。 可能是您的包过程导致了问题,也可能是其他原因(您必须分析代码)。

当出现死锁时, 您可以等待几分钟,然后尝试重新执行已回滚的语句

您可以执行回滚并重新执行自上次提交以来的所有语句


我不确定这件事……但是你可以参考这个网站链接……

死锁由两个会话相互锁定组成,因此Oracle必须取消一个事务,以防止它们无限期地保持锁定状态

假设我删除了第1项,你删除了第2项,我们两人都没有提交

现在我尝试删除第2项-但我不能,因为您未提交的删除操作正在锁定行,因此我的会话将在阻止状态下等待您提交或回滚删除操作

现在您尝试删除项目1。您不能,因为我的未提交删除仍在锁定该行。现在你被我的会话阻止了,但我已经被你阻止了。(您需要我提交或回滚,但我不能这样做,因为我被您阻止了。)两个会话将永远等待

Oracle检测到这种情况,并通过取消和回滚其中一个事务、引发ORA-00060并将死锁报告写入数据库警报日志进行干预

有关详细信息,请查看警报日志,并检查应用程序逻辑以阻止将来发生这种情况

编辑-感谢您发布跟踪详细信息

会话2274正在等待2566(以获得SSX模式锁)。
第2566次会议正在等待1851年。
1851会议等待2274

关于锁定模式的一些注意事项:

SSX(共享子独占)与
“共享行独占模式下的锁定表”
相关联。有时锁及其相关模式并不明显,例如,直接路径
插入表中,或通过外键进行级联删除(特别是在未索引子键的情况下)将导致您可能不期望的锁


这个问题的答案中也可能有一些线索:

这种问题通常是由于缺少索引造成的。如果删除表达式中没有where子句的任意索引,oracle不仅会锁定要删除的记录,还会执行表锁定。
确保您的索引包含delete语句where子句中使用的大多数列。

听起来像是打包过程中的设计缺陷。如果你想不出来,你需要在这里发布代码,或者至少是一个复制问题的代码的简化版本。我已经从trace添加了信息,请检查并帮助。谢谢详细解释。然而,在我的例子中,我删除了项目1,您删除了项目2,而person X删除了项目3,我们都没有尝试删除项目1、2或3,所以我不应该出现死锁错误。我已经添加了跟踪,请检查并让我知道。