ITPub博客

首页 > 数据库 > Oracle > 一则案例分析之“enq: TX - row lock contention ”

一则案例分析之“enq: TX - row lock contention ”

原创 Oracle 作者:tompson666 时间:2025-12-18 20:46:57 0 删除 编辑
  1. 数据库TOP等待“enq: TX - row lock contention”:


  2. Load Profile无明显异常,OS负载均正常:


         -


3.尝试查看hist 时间段的sql信息,执行结果几分钟都不出结果,SQL查询执行计划:


4.分析dba_hist_active_sess_history(基表 SYS. WRH$_ACTIVE_SESSION_HISTORY),基于sample无索引;由于设置保留策略,基表仅20W数据,导致阻塞查询COST相当高:

5.创建基于时间段的临时表,降低COST基数:

create test.tmp_ash as select *

from dba_hist_active_sess_history t where to_date(to_char(SAMPLE_TIME,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') >=to_date('2025/12/08 15:00:00','yyyy-mm-dd hh24:mi:ss') and to_date(to_char(SAMPLE_TIME,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') <=to_date('2025/12/08 15:05:00','yyyy-mm-dd hh24:mi:ss')

--创建基于sample_time索引(略)


6.基于临时表查询执行计划及结果:

--COST大幅度降低


--查询结果主要等待事件"enq: TX - row lock contention"






7. 查询 hist 阻塞 , 至少 3 sid 进行 update 相同行


8.取样单个update为索引唯一扫描



9.汇总故障时间段的阻塞:

sid 492阻塞sid134次数28449

sid 492阻塞sid367次数74820


10.性能原因及建议:

原因:唯一索引行锁阻塞,在同时间多个会话获取同一行(unique scan)。

优化建议:

-优化锁控制机制,规避多个事务同时获取相同行锁(多线程行互斥锁定)

-设置tx超时限制,避免长事务不提交



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70038077/viewspace-3105649/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE PostgreSQL ACE PG/MySQL内核技术推广者 著有《Oracle高性能自动化运维》 目前致力于Oracle/MySQL/PG技术推广&信创项目交付&最佳实践探索。公众号:dba悠然

注册时间:2024-04-14

  • 博文量
    42
  • 访问量
    33729