问题现象
制单时,选择公司就会卡住不动,其他节点正常。
问题分析
通过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卡住线程都已经释放,再次测试系统恢复正常。