ORA-00060: 等待资源时检测到死锁

Posted

技术标签:

【中文标题】ORA-00060: 等待资源时检测到死锁【英文标题】:ORA-00060: deadlock detected while waiting for resource 【发布时间】:2011-03-05 17:27:06 【问题描述】:

我有一系列脚本作为 nohup 在托管 oracle 10g 的 AIX 服务器上并行运行。这些脚本是由其他人编写的,旨在同时执行。所有脚本都在表上执行更新。我收到了错误,

ORA-00060: 检测到死锁 等待资源

当我搜索这个时,我发现, http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm

即使脚本同时对同一个表执行更新,它们也会对由WHERE 子句确定的表的不同记录执行更新,并且它们之间没有记录重叠。

那么这会导致错误吗?

无论在表的何处执行更新,都会发生此错误吗?

我是否应该始终避免对表进行并发更新?

奇怪的是,我还在 nohup.out 日志中发现, PL/SQL successfully completed 在上面引用的错误之后。

这是否意味着 oracle 已从死锁中恢复并成功完成更新,还是我应该连续重新运行这些脚本? 欢迎任何帮助。

提前致谢。

【问题讨论】:

【参考方案1】:

您可能会遇到更多的死锁,而不仅仅是行锁,例如见this。脚本可能会竞争其他资源,例如索引块。

过去,我通过设计并行性来解决这个问题,使不同的实例处理工作负载的一部分,这些工作不太可能影响彼此靠近的块;例如,对于一个大表的更新,我不会使用MOD(n,10) 之类的东西来设置并行从属服务器,而是使用TRUNC(n/10),这意味着每个从属服务器都在处理一组连续的数据。

当然,有更好的方法来拆分作业以实现并行性,例如DBMS_PARALLEL_EXECUTE.

不知道为什么你得到“PL/SQL 成功完成”,也许你的脚本正在处理异常?

【讨论】:

【参考方案2】:

我最近遇到了类似的问题。事实证明,数据库缺少外键索引。这导致 Oracle 锁定了比要求更多的记录,这很快导致了高并发期间的死锁。

这是一篇优秀的文章,其中包含许多关于如何修复死锁的详细信息、建议和详细信息: http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk

【讨论】:

【参考方案3】:

我也遇到了这个问题。我不知道实际发生的事情的技术细节。但是,in my situation,根本原因是 Oracle 数据库中存在级联删除设置,而我的 JPA/Hibernate 代码也在尝试执行级联删除调用。所以我的建议是确保你确切地知道发生了什么。

【讨论】:

【参考方案4】:

我正在测试一个在 IF-ELSE 块中有多个 UPDATE 语句的函数。

我正在测试所有可能的路径,因此我每次在再次运行该函数之前都使用“手动”UPDATE 语句将表重置为之前的值。

我注意到这个问题会在那些UPDATE 语句之后发生;

我在用于重置表的UPDATE 语句之后添加了COMMIT;,从而解决了问题。

所以,请注意,问题不在于函数本身......

【讨论】:

这是一个吸引人的建议,除了我希望稍后在我的 PL/SQL 脚本中回滚的选项。如果我已经承诺,我就失去了这种可能性。

以上是关于ORA-00060: 等待资源时检测到死锁的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00060死锁案例

oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法

案例分析:你造吗?有个ORA-60死锁的解决方案

oracle 死锁和锁等待的区别,锁等待

如何解决多线程造成的数据库死锁

记录一波由会话堵塞导致tomcat应用故障事件