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: 等待资源时检测到死锁的主要内容,如果未能解决你的问题,请参考以下文章