内容阅读
在知识库中专注阅读,并随时返回相关工具与课程
ORA-00060严重锁
等待资源时检测到死锁
Deadlock detected while waiting for resource
错误描述
两个或多个会话之间形成了循环锁依赖,互相阻塞。Oracle 自动回滚其中一个会话的语句来解除死锁。
可能原因
- 两个会话以不同顺序更新相同的行
- 未索引的外键导致在父表 DML 时产生表级锁
- 应用设计问题——锁的获取顺序不一致
解决方案
- 1在外键列上添加索引以防止表级锁
- 2确保所有应用代码中锁的获取顺序一致
- 3查看 USER_DUMP_DEST 中的跟踪文件获取死锁图详情
- 4重试被回滚的事务
诊断命令
SELECT * FROM v$lock WHERE block = 1;-- Check for unindexed foreign keys:\nSELECT c.table_name, c.constraint_name, cc.column_name FROM dba_constraints c JOIN dba_cons_columns cc ON c.constraint_name = cc.constraint_name WHERE c.constraint_type = 'R' AND NOT EXISTS (SELECT 1 FROM dba_ind_columns ic WHERE ic.table_name = c.table_name AND ic.column_name = cc.column_name);#deadlock#lock#contention#foreign-key