enq: TX - row lock contention 等待事件

转载 2016年03月22日 13:46:44

数据库版本:11.2.0

 

今天在使用rman备份的时候随意的查看了一下等待事件,除了了我们现在系统遇到的IO瓶颈外,还额外的发了enq: TX - row lock contention等待事件

 

1:查询当前系统的等待事件

 

select event,sid,p1,p2,p3 from v$session_wait where event not like 'SQL*%' and event not like 'rdbms%';


EVENT                                   SID         P1              P2             P3
----------------------------------     ----      ----------       ----------    ----------
enq: TX - row lock contention     4    1415053318     196638        55836
RMAN backup & recovery I/O      5            1               256       2147483647
enq: TX - row lock contention    12    1415053318     524293        51153
RMAN backup & recovery I/O     25           1                256      2147483647
db file sequential read             27          16             2876703         1
pmon timer                             33         300                0               0
db file scattered read               39          33              790536         128
VKTM Logical Idle Wait            49           0                   0               0
Streams AQ: qmn slave idle wait         50          1          0          0
asynch descriptor resize           53          1              4294967295    1237
jobq slave wait                       54          0                     0          0

 

EVENT                                   SID         P1           P2                 P3
-------------------------------------------    -------       ----------          ----------
db file sequential read             170         33         1100519            1
direct path read                      181         44          469892           124
enq: TX - row lock contention    212 1415053318     524293         51153
smon timer                             225        300          0       0
enq: TX - row lock contention    232 1415053318     524293         51153
direct path read                      234         16           1099776         128
Streams AQ: qmn coordinator idle wait  242          0          0         0

 

 

上面的等待事件说明session4,12,212,232想加锁,但是有别的session占着,所以等待。

 

 

enq是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO)

发生TX锁的原因一般有几个

1.不同的session更新或删除同一个记录。

2.唯一索引有重复索引

3.位图索引多次更新

4.同时对同一个数据块更新

5.等待索引块分裂

 

 

2:下面我们通过enq: TX - row lock contention来看看这些session都在等什么

 

select ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session where event='enq: TX - row lock contention';

 

ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
------------- -------------- --------------- -------------
        87556             57             395            88
        87564             57             435             0
        87564             57             435             0
        87564             57             435             0
        87564             57             435             0

 

 

 


3:通过上面sql查找出来的对象编号找到对应的对象名称

 

SQL> select object_name from dba_objects where object_id in (87564);

OBJECT_NAME
-----------
QRTZ_LOCKS

 

 

4:通过对象名称找出该对象的对应属性,对象属性为TABLE

 

SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_name='QRTZ_LOCKS';

 

OWNER      OBJECT_NAME  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE

SCHEDULE   QRTZ_LOCKS     87564          87564               TABLE 

 

5:通过正在等待的SID查看它们都在执行什么操作

SQL> select sid,sql_text from v$session a,v$sql b where sid in(4,12,41,212,232) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);

 SID SQL_TEXT
---- ----------------------------------------------------------------------------------------------------
   4 UPDATE QRTZ_CRON_TRIGGERS SET CRON_EXPRESSION = :1 WHERE TRIGGER_NAME = :2 AND TRIGGER_GROUP = :3
  12 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE
  41 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE
 212 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE
 232 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE

 

从上面的结果可以看出,SCHEDULE用户下的五个session同时在执行一条相同的sql语句,对应的对象则是QRTZ_LOCKS 这个表, 所以发生了锁,从而产生等待,通过和同事的交流,得知这个一个ETL程序要访问的表,里面只有五条数据,但是却要时时调度。  

6:下面我们去找一下对应sid产生的锁

 

SQL> select SID,TY,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK from V$lock where block=1 or request<>0;
         SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
 ---------------- ---- -- ---------- ---------- ---------- ---------- ---------- ----------
         41  TX     524293      51153          0          6       3846             0
         12  TX     524293      51153          0          6       4190             0
         232 TX     524293      51153          0          6       4626             0
         212 TX     524293      51153          0          6       4749             0
      
    4  TX     196638      55836          0          6       4755              1
         44  TX     196638      55836          6          0       4765              1

 

由此可以查看,BLOCK=1的sid是该等待事件的根源,其他session则等待该锁被释放。

解决方法:

1:通过v$session找到BLOCK=1的用户,告知用户提交事务

2:通过sid找到pid,kill掉该进程

3:更改sql语句,SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE no wait

加nowait的意思是得到或者得不到,不会等待

enq: TX - row lock contention 等待事件

OS环境:windows server 2008 64位数据库版本:11.2.0今天在使用rman备份的时候随意的查看了一下等待事件,除了了我们现在系统遇到的IO瓶颈外,还额外的发了enq: TX -...
  • SongYang_Oracle
  • SongYang_Oracle
  • 2011-05-20 09:55:00
  • 26843

enq: TX - row lock contention故障处理一则

一个很简单的问题,之所以让我对这个问题进行总结,一是因为没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路,二是引发了我对故障处理时的一些思考。...
  • oradh
  • oradh
  • 2014-06-20 14:18:54
  • 3000

enq: TX - row lock contention等待事件

http://www.oracleonlinux.cn/2012/11/resolve-row-lock-contention/ enq: TX - row lock contention 等待事件...
  • zhengwei125
  • zhengwei125
  • 2016-06-12 12:00:46
  • 927

enq: TX - row lock contention 参数P1,P2,P3的讲解

enq: TX - row lock contention等待事件的三个参数如下,其中P2和P3可以定位XID
  • robo23
  • robo23
  • 2015-03-18 21:11:04
  • 1615

[Oracle] enq: TX - row lock contention 优化案例

根据开发反馈,最近每天早上7:30应用会报警,应用的日志显示数据库连接池满了,新的连接被拒绝。 首先,我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - r...
  • u010415792
  • u010415792
  • 2014-06-04 09:28:56
  • 2737

一次数据库相关操作卡住的排查--enq: TX - row lock contention

问题描述:某日客户来电某HR系统排值班表的操作一直HANG住,一直无法完成。 这种问题,主要思路是围绕查看此操作因何HANG住。 常见的严重的HANG住有DB方面的AUDIT无空间、归档空间满以及...
  • q947817003
  • q947817003
  • 2015-08-24 16:45:26
  • 4076

AWR报表-enq: TX - row lock contention事件解决方法

enq: TX - row lock contention事件是锁等待事件,今天我要做一个例子来模拟这类事件的出现。      测试环境如下:            现在我们进行测试,用1个会话ses...
  • suyishuai
  • suyishuai
  • 2014-03-03 15:05:00
  • 1084

事务上的等待事件 —— enq: TX - contention

TX锁是保护事务的,事务结束时便会释放。因此,为获得TX锁为等待的会话,要等到拥有锁的会话的事务结束为止。 SQL> select name,parameter1,parameter2,parame...
  • zq9017197
  • zq9017197
  • 2012-09-29 14:28:42
  • 1720

解决enq: TX - index contention的常用方法

解决enq: TX - index contention的常用方法
  • msdnchina
  • msdnchina
  • 2015-05-22 23:29:31
  • 3246

enq:TX-index contention等待事件

此等待事件发生的版本从10.2到11.2,在任何平台都会出现 产生的原因:在OLTP RAC系统上,高并发应用下,与表相关的索引会发生很高的TX队列的争用。这通常在所有实例并发应用大量的INNSER...
  • u013428681
  • u013428681
  • 2014-11-18 17:23:47
  • 1603
收藏助手
不良信息举报
您举报文章:enq: TX - row lock contention 等待事件
举报原因:
原因补充:

(最多只允许输入30个字)