我有一系列脚本作为nohup在托管oracle10g的AIX服务器上并行运行.这些脚本是由其他人编写的,应该是并发执行的.所有脚本都在一个表上执行更新.我发现了一个错误,

ORA-00060:在运行时检测到死锁

当我在谷歌上搜索这个的时候,我发现, http://www.dba-oracle.com/t_deadly_perpetual_embrace_locks.htm

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

那么,这会不会是导致错误的原因呢?

无论在表的哪个位置执行更新,都会出现此错误吗?

我应该避免在任何时候同时更新表吗?.

奇怪的是,我在nohup上也发现了.出日志(log),

这是否意味着Oracle已经从死锁中恢复并成功地完成了更新,或者我应该按顺序重新运行这些脚本? 欢迎任何帮助.

提前谢谢.

推荐答案

您可以在多个行锁上获得死锁,例如,请参见this.脚本可能会竞争其他资源,例如索引块.

过go ,我通过设计并行性来解决这个问题,使不同的实例处理工作负载中不太可能影响彼此靠近的块的部分;例如,对于一个大表的更新,我使用TRUNC(n/10)来代替使用MOD(n,10)来设置并行从机,这意味着每个从机处理一组连续的数据.

当然,有更好的方法来划分并行作业(job),例如DBMS_PARALLEL_EXECUTE个.

不确定为什么会得到"PL/SQL成功完成",可能是您的脚本正在处理异常?

Database相关问答推荐

触发器作为完整性的判断约束

当某些 node 死亡时,mongo 副本集选举如何表现?

当我们需要触发程序的返回值时?

如何打印出 sequelize 实例的表名?

MongoDB 单文档大小限制为 16MB

在 MySQL 中创建表时如何定义列的默认值?

使用 LiquiBase 和 Spring 将大量值(使用 FK)插入数据库

为什么 DynamoDB 查询中没有**not equal**比较?

通过生成迁移将索引:唯一添加到 ruby​​ on rails 中的列

如何在 2 个 MySQL 数据库之间传输数据?

在 MS SQL 中使用 GUID 作为主键是不是一个坏主意?

为什么 MySQL 连接被许多连接错误阻止?

在 SQL Server 2005 中将数据库从一个驱动器移动到另一个驱动器的正确方法是什么?

此平台不支持 LocalDB

在 MySQL 中 Select 浮点数

从 postgresql 转储文件填充 MySQL 数据库

Redis-cli - Select 哪个实例?

如何在 SSIS 中插入新记录之前清空我的目标表?

如何在我的 SQL Server 代理作业(job)中创建一个将运行我的 SSIS 包的步骤?

传递依赖有什么问题?