中文

错误:ORA-00060:等待资源期间检测到死锁

错误消息

当一个或多个会话尝试获取当前正被另一个会话阻停的数据库对象中的资源,而第二个会话也正尝试获取被第一个会话阻停的资源时,将发生 Oracle 死锁。

要解开死锁,需要 Oracle 释放其中一个会话阻停的资源,并返回一个错误以允许另一个会话继续。 在此过程中,将创建冲突会话的追踪文件,其路径取决于 user_dump_dest 初始化参数的值。

压缩版本化的地理数据库时,压缩命令可能会遇到 Oracle 错误“ORA-00060:等待资源期间检测到死锁”。

原因

如果压缩过程中遇到 Oracle 错误,所遇到的死锁并非通常类型的死锁,即两个会话正竞争/阻止要进行更新或删除的同一行对象的请求,而阻止了段落区块标题中的 ITL 空位。

为获取问题的详细说明,请查看 Oracle Metalink 文档 62354.1 “TX 事务锁定 - 等待场景示例”,位于“由于区块内 'ITL’ 空位不足而等待”部分之下。

所遇到的阻止条件与 state_lineages 表中或者其索引 lineages_pk 或 lineage__id_idx2 中遇到的情况类似。

在大量用户同时编辑版本化的地理数据库期间执行压缩时,错误通常为清单本身。

解决方案或解决方法

为解决死锁错误,SDE 用户必须重新创建 state_lineage 表索引或表,并增加对象区块标题中初始事务空位数的值。

默认情况下,ArcGIS 在创建用于版本化的所有表和索引时,会将 initrans 值设置为 4。 Initrans 值在关键词 DATA_DICTIONARY 下的 dbtune.sde 文件中进行控制,但仅在初始创建实例时引用。

要增加索引的 initrans 值,SDE 用户需重新构建索引并指定新值。

代码:
SQL> ALTER INDEX lineages_pk REBUILD INITRANS 8;

索引已修改。

SQL> ALTER INDEX lineages_id_idx2 REBUILD INITRANS 8;

索引已修改。


要增加 state_lineages 表的大小,请修改表。

代码:
SQL> ALTER TABLE state_lineages INITRANS 8;

表已修改。


表的限制在于修改不会改变现有数据块,仅在添加了新块后表才会增大。 如果锁死发生在表中且修改表无法解决此问题,则需要将表本身导出、删除,然后重新创建。 此外,还需要设置更大的 initrans 值,并将行导入回新表。

将 initrans 值设置为 8 以上已足够,但是对于会有许多编辑者同时使用的更大组织而言,8 的值可能仍无法满足需求。 Oracle DBA 应监控实例并搜索因等待 ITL 空位而导致阻止情况的频率。 如果经常发生等待事件,则应该进一步增大该值。 有关如何监控阻止情况的说明,请参阅 Oracle 文档。

    相关信息