尝试从表中删除行时出错

时间:2018-08-28 08:51:21

标签: java oracle plsql oracle-adf

我在一个从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

4 个答案:

答案 0 :(得分:2)

死锁由两个互相锁定的会话组成,因此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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

当发生任何死锁时, 您可以等待几分钟,然后尝试重新执行已回滚的语句。

您可以执行ROLLBACK并重新执行自上一次执行COMMIT以来的所有语句。

我不确定这件事。.但是您可以参考此网站链接http://www.dba-oracle.com/t_ora_00060_deadlock_detected_while_waiting_for_resource.htm ...