该等待事件产生的几个原因有
1、多个会话对同一行数据进行更新。这样的话,最先对该行进行更新的会话获得该行的TX锁,其他申请对该行更新的会话只能等待。只有该所得持会话提交或回滚释放该锁,该等待事件才会消失。
2、多个会话对具有唯一索引的行更新或插入同一值。
3、多个会话插入或更新具有位图索引的列。
4、BUG 5849679 在10.2.0.x版本的RAC环境中存在的bug。
5、调用dbms_repair包时也会产生TX。
前三种情况出现的可能性比较大。
出现这个问题的排查解决思路
1、找出出现该等待事件的会话及sql。
select a.sid,
a.SERIAL#,
a.EVENT,
a.BLOCKING_SESSION, ----锁的持有者的sid
b.sql_text,
b.SQL_FULLTEXT,
a.SECONDS_IN_WAIT -----等待时间
from v$session a, v$sql b
where a.EVENT = 'enq: TX - row lock contention'
and a.SQL_ID = b.SQL_ID
2、若系统因为该问题造成比较大影响,可以先将会话杀掉。
alter system kill session 'sid,serail#'
3、该问题属于application问题,若需彻底解决,需要应用进行修改。