Menu Close

Oracle队列等待之enq: TX – row lock contention(一)

1. TX行锁产生原因

  • 第一种情况:当两个会话对同一行进行更新时,ORACLE为了保证数据库的一致性,加了一个TX锁,这时另一个或多个会话必须等待第一个会话commit或rollback,否则会一等待下去,这是最为常见的一种模式!
  • 第二种情况:两个或多个会话向具有唯一主健索引的表中插入或更新相同的数据行,既然是唯一主健索引,那么先获得插入的session以TX排它锁模式进行添加,此时其它session只能等待,也是常见的一种情况
  • 第三种情况:两个或多个会话插入或更新具有位图索引的列,跟据位图索引的特性,一个索引键值对应多个数据行的rowid值,此种情况下也是以TX模式访问,一般在OLTP系统中很少有位图索引,但不排除个别系统。
  • 第四种情况:调用dbms_repair包时也会产生TX
  • 第五种情况:由ORACLE BUG引起的(Bug 5849679 - Undetected deadlock in RAC involving a TM lock)

产生该等待事件的原因基本上就是上面五种情况,前三种优为常见.

2. TX行锁的危害

会导致其他会话的相关业务操作hang住

2.1. 业务操作长时间无法完成

用户投诉

2.2. 会导致会话积压

数据库连接池逐渐被占满
应用获取不到数据源无法创建新的数据库连接
或操作系统CPU、内存资源逐渐耗尽,无法创建新的数据库连接

2.3. 会导致产生其他争用

如bufferbusy wait, ITL contention等

3. TX行锁的解决方案

1、先行会话需要结束事务(transaction):commit或者rollback
2、强制结束先行会话:kill session。

4. 查询TX行锁

dba_hist_active_sess_historyv$active_session_history
参考:http://blog.chinaunix.net/uid-31396856-id-5784934.html
https://blog.csdn.net/cscscscsc/article/details/62422686

4.1. 查询当前TX行锁

参见:
Oracle查询当前enq: TX – row lock contention

4.2. 查询历史TX行锁

参考:
https://www.sohu.com/a/207720182_505827
https://chowdera.com/2021/04/20210418131719513G.html
https://www.cndba.cn/leo1990/article/2769
https://www.cnblogs.com/datalife/p/9759471.html (RAC)