【问题标题】:ORA-00060: deadlock detected while waiting for resourceORA-00060: 等待资源时检测到死锁
【发布时间】: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 已从死锁中恢复并成功完成更新,还是我应该连续重新运行这些脚本? 欢迎任何帮助。

提前致谢。

【问题讨论】:

    标签: database oracle unix plsql aix


    【解决方案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 脚本中回滚的选项。如果我已经承诺,我就失去了这种可能性。
          猜你喜欢
          • 2018-04-27
          • 2016-01-22
          • 1970-01-01
          • 2016-09-02
          • 2013-09-04
          • 2021-04-20
          • 1970-01-01
          • 2023-03-26
          • 2014-12-23
          相关资源
          最近更新 更多