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

来源:这里教程网 时间:2026-03-03 22:59:46 作者:

    数据库TOP等待“enq: TX - row lock contention”:

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

相关推荐