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

问题描述 投票:21回答:4

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

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

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

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

那么这会导致错误吗?

无论在表上执行更新的位置,都会发生此错误吗?

我应该一直避免在桌面上同时进行更新吗?

奇怪的是,我也在nohup.out日志上找到了PL/SQL successfully completed之后的上述引用错误。

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

提前致谢。

database oracle unix plsql aix
4个回答
11
投票

您可以获得不仅仅是行锁的死锁,例如见this。脚本可能正在竞争其他资源,例如索引块。

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

当然,有更好的方法来分割并行工作,例如: DBMS_PARALLEL_EXECUTE

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


29
投票

我最近在努力解决类似的问题。原来,数据库缺少外键索引。这导致Oracle锁定了多于所需的记录,这些记录在高并发期间很快导致死锁。

这是一篇很棒的文章,里面有很多关于如何解决僵局的详细信息,建议和细节:http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk


3
投票

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


1
投票

我正在测试一个在qazxsw poi块中有多个qazxsw poi语句的函数。

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

我注意到问题会发生在那些IF-ELSE声明之后;

我在UPDATE语句之后添加了一个UPDATE我用来重置表格并解决了这个问题。

所以,谨慎,问题不在于功能本身......

© www.soinside.com 2019 - 2024. All rights reserved.