教你一步步摸索oracle死锁问题到底咋查才靠谱
- 问答
- 2025-12-25 06:48:51
- 1
要一步步摸索Oracle死锁问题,咱们可以把它想象成破案,你不是警察,但死锁就是那个发生在数据库里的“小案子”,你的任务就是找到案发现场,抓住两个“肇事者”(被锁住的事务),然后搞清楚他们为什么“掐架”,下面就是一套比较靠谱的查案流程。
第一步:确认案发现场,真的有死锁吗?
你得知道是不是真的发生了死锁,用户可能会跑来跟你说“系统卡住了”、“页面没反应了”,这时候,你别急着就往死锁上想,先做个初步排查。
- 看数据库告警日志: 这是最直接的方法,Oracle一旦检测到死锁,就会在告警日志(alert_
.log)里留下确凿的证据,它会记录一个“ORA-00060: deadlock detected”的错误,并且会附上一份“死锁图”(Deadlock Graph),这份图就是你的第一个,也是最重要的线索,你可以用一些工具直接查看告警日志文件,或者通过一些SQL语句来查询近期的错误信息。(来源:Oracle官方文档关于ORA-00060错误的说明) - 看应用日志: 如果应用捕获并记录了数据库错误,那么应用日志里也很可能会有同样的ORA-00060错误信息,这能帮你快速定位是哪个程序或功能模块出了问题。
第二步:分析死锁报告,抓住两个“肇事者”
一旦确认是死锁,并且拿到了告警日志里的死锁图,接下来就是仔细研究这份“验尸报告”了,死锁图看起来可能有点复杂,但核心信息就几点:

- 会话信息: 图上会标明参与死锁的两个(或多个)会话的ID(SID)和序列号(SERIAL#),这就好比知道了是哪两个人在打架。
- 资源争用关系: 图会用箭头清楚地画出来:会话A持有了某个资源(比如一行数据),同时又在等待另一个被会话B持有的资源;而会话B呢,也在等待会话A手里的那个资源,这个循环等待的关系,就是死锁的核心,图里会显示这些资源的标识符,比如具体是哪张表、哪个数据块、哪一行(用ROWID表示)。
(来源:Oracle官方文档中对死锁图的解释)
第三步:深挖“肇事者”的底细,看看他们当时在干嘛
光知道谁在打架还不够,你得知道他们为什么打架,现在你有了会话的SID和SERIAL#,就可以用这个作为线索,去数据库里挖出更多信息。

- 查SQL语句: 这是最关键的一步,你可以通过查询像
V$SESSION、V$SQL这样的动态性能视图,找到这两个会话当时正在执行或者最后执行的一条SQL语句是什么,把这两条SQL语句都拿出来。SELECT sql_text FROM v$sql WHERE sql_id = (SELECT sql_id FROM v$session WHERE sid = &死锁会话ID);(来源:Oracle DBA常用的故障排查方法) - 查操作对象: 结合死锁图里提到的表名和ROWID,你就能精确地知道这两条SQL语句到底是在争抢哪张表的哪一行数据。
第四步:还原案发经过,推理死锁成因
你手上有了两条SQL语句和它们争抢的数据对象,接下来就像侦探一样,把碎片拼凑起来,推理出死锁是怎么发生的,常见的死锁原因无非几种:
- 不同顺序的更新: 这是最常见的原因,事务A先更新了表X的第1行,然后去更新表Y的第2行;而事务B正好相反,先更新了表Y的第2行,然后去更新表X的第1行,这种情况下,只要两个事务同时运行,就很容易陷入互相等待,你的SQL语句如果能显示出他们以不同顺序操作了相同的几张表,那基本就是这个问题。
- 索引缺失导致锁升级: 如果一个表没有合适的索引,一条UPDATE语句可能不会精确地锁住一行,而是锁住一大片数据(比如锁了整个数据块),这可能会无意中扩大了锁的范围,导致两个本来不相干的事务意外地锁住了对方需要的资源。(来源:Oracle性能优化相关实践中常提到的观点)
- 应用逻辑错误: 有时候是程序代码写得有问题,比如在一个大事务里,更新资源的顺序不固定,会根据不同的业务分支发生变化,这就埋下了死锁的隐患。
第五步:解决问题并预防
找到根源后,解决起来就有方向了。
- 短期解决: 死锁发生时,Oracle已经自动选择牺牲掉其中一个事务(回滚它),让另一个事务继续,所以通常不需要你手动干预,你可能需要做的就是通知用户重试那个被回滚的操作。
- 长期根治: 这才是重点,根据你找到的原因:
- 如果是更新顺序问题,就要和开发人员沟通,规范代码,确保对所有公共资源的访问(特别是更新操作)都遵循一个固定的、相同的顺序。
- 如果是索引缺失问题,可以考虑增加合适的索引,让SQL语句能更精准地定位到数据行,减少不必要的锁竞争。
- 优化事务设计,让事务尽量短小精悍,快进快出,减少持有锁的时间。
查死锁是个经验活,多处理几次就熟练了,核心思路就是:确认死锁 -> 抓住会话 -> 分析SQL -> 推理原因 -> 根治问题,按照这个步骤来,就不会像无头苍蝇一样乱撞了。
本文由称怜于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/68015.html
