ORA-12829: Deadlock – itls occupied by siblings at block string of file string
Cause: parallel statement failed because all itls in the current block are occupied by siblings of the same transaction.
Action: increase MAXTRANS of the block or reduce the degree of parallelism for the statement. Reexecute the statement. Report suspicious events in trace file to Oracle Support Services if error persists.
ORA-12829 是一个典型的死锁错误,该错误表明存在以下问题:两个或多个相关进程(也称为“兄弟进程”)在相互锁定同一个数据块,而这种形式的死锁不可解决。
这是一个相当普遍的情况,其中在处理大量用户请求时,大量交叉会话将向同一个块发送Lookup,而由于乐观数据锁机制,另一个会话已经锁定了该块,从而造成死锁。
步骤 1:用户应该立即停止所有运行的性能和负载测试,以便停止可能导致最大垃圾数量的负载。
步骤 2:从所有会话中终止任何正在等待或在锁定块时保持会话活动状态的SQL语句。
步骤 3:实施一些索引和排序改进,以便避免一个会话影响另一个会话的数据文件。
步骤 4:检查数据库的工作负载和数据库结构,找出导致另一个会话产生死锁的原因。
步骤 5:增加空间,减少用户可能存在的压力,必要时根据数据库的规范加大数据库的事务会话数。
步骤 6:针对具有竞争资源的具体环境,应注意改编已存在的应用程序,以避免提交事务以较长时间为基础的可能死锁。
步骤 7:对于导致另一个会话产生死锁的事务,应确保它可以在最短的时间内完成其工作,以减少可能的可重复性问题。
步骤 8:考虑影响该资源的其他活动,并考虑实施不同的负载,以减少另一个会话可能影响该资源的能力。
步骤 9:考虑比 Oracle 更可靠但不一定比正常死锁事务更好的数据库解决方案,例如重新设计数据库 de Normaliser,以避免另一个会话访问要锁定的资源。
步骤 10:最后,考虑在不考虑其他步骤的情况下使用 Oracle 10g 中的 AUTO_DML_LOCK 参数,该参数将阻止由外部应用程序或控制表达式引起的外部死锁。