【案例47】enq: TX - row lock contention事件导致制单卡死

问题现象

制单时,选择公司就会卡住不动,其他节点正常。

问题分析 

通过nmc排查,发现后台有很多制单线程卡住,时间较久,并且当前的事件都是在数据库执行sql层面。并且每条线程的卡住语句都为update语句,怀疑是有update语句未提交事务,导致数据库锁,进而堵塞相关线程导致的。

排查数据库状态。发现有大量的enq: TX - row lock contention 的等待事件,enq: TX - row lock contention 用于在事务执行时维护事务的完整性,会在事务所涉及的修改行中添加TX锁以防止其他会话同时修改数据,当其他会话等待该TX锁的释放时,就会产生enq:TX -row lock contention等待事件。发现堵塞源头的id值为134

select last_call_et,v.event,
    s.sql_id,
      ---   s.SQL_FULLTEXT,
         s.SQL_TEXT,
        v.inst_id,
         V.SID,
         V.CLIENT_IDENTIFIER,
         v.blocking_session,
         v.blocking_session_status,
         'alter system kill session ''' || v.sid || ',' || v.serial# || ''' immediate;',
          v.USERNAME,
         s.CPU_TIME,
         s.ELAPSED_TIME,
         v.PROGRAM,
         'kill -9 ' || p.spid,
         v.CLIENT_INFO,
         v.SQL_HASH_VALUE,
         v.SQL_ADDRESS,
         v.MACHINE,
         v.TERMINAL, s.DISK_READS,s.BUFFER_GETS,s.SORTS,s.SHARABLE_MEM,s.PERSISTENT_MEM,s.RUNTIME_MEM,s.ROWS_PROCESSED    
from gv$session v, gv$process p, gv$sql s  
   where v.last_call_et > 0  
     and v.status = 'ACTIVE'
     and v.username != 'SYS'
     and p.addr = v.paddr
     and s.ADDRESS = v.SQL_ADDRESS
     and s.HASH_VALUE = v.SQL_HASH_VALUE
   order by last_call_et desc;

查看134相关状态发现,此语句为程序触发,并且也为应用服务器。 

查询解锁语句

---xxx替换为源头ID
select CLIENT_IDENTIFIER,
       v.inst_id,
       v.status,
       'alter system kill session ''' || v.sid || ',' || v.serial# ||
       ''' immediate;',
       v.USERNAME,
       v.CLIENT_INFO,
       v.SQL_HASH_VALUE,
       v.SQL_ADDRESS,
       v.MACHINE,
       v.TERMINAL
  from gv$session v
 where sid = 'XXX';

解决方案 

解锁源头,执行alter system kill session 语句。

解锁后发现nmc卡住线程都已经释放,再次测试系统恢复正常。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值