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

  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超时限制,避免长事务不提交



请使用浏览器的分享功能分享到微信等