Oracle “enq: TX - row lock contention 等待事件 ”
2013-12-21 09:58
447 查看
OS环境:Hp-Unix 11.11
数据库版本:11.2.0
1:查询当前系统的等待事件
select event,sid,p1,p2,p3 from v$session_wait where event not like 'SQL*%' and event not like 'rdbms%';
上面的等待事件说明session2094锁,但是有别的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';
3:通过上面sql查找出来的对象编号找到对应的对象名称
SQL> select object_name from dba_objects where object_id in (44733);
4:通过对象名称找出该对象的对应属性,TABLE
和View
SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_name='TMP_EQP_DETAIL';
5:通过正在等待的SID查看它们都在执行什么操作,第一步操作时得到的“SID”
SQL> select sid,sql_text from v$session a,v$sql b where sid in(2904) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);
从上面的结果可以看出,PCTEST用户下的2个session同时在执行一条相同的sql语句,对应的对象则是TMP_EQP_DETAIL这个表,所以发生了锁,从而产生等待
6:找一下对应sid产生的锁
a380
SQL> select SID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK from V$lock where block=1 or request<>0;
由此可以查看,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的意思是得到或者得不到,不会等待
数据库版本:11.2.0
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 |
db file sequential read | 2061 | 25 | 905978 | 1 |
enq: TX - row lock contention | 2094 | 1415053318 | 458765 | 14122744 |
Streams AQ: waiting for messages in the queue | 2126 | 46863 | 1.38351E+19 | 2147483647 |
Streams AQ: waiting for messages in the queue | 2132 | 46841 | 1.38351E+19 | 2147483647 |
Streams AQ: waiting for messages in the queue | 2133 | 46840 | 1.38351E+19 | 2147483647 |
Streams AQ: waiting for messages in the queue | 2154 | 46862 | 1.38351E+19 | 2147483647 |
Streams AQ: qmn slave idle wait | 2182 | 0 | 0 | 0 |
Streams AQ: qmn coordinator idle wait | 2184 | 0 | 0 | 0 |
Streams AQ: waiting for time management or cleanup tasks | 2193 | 0 | 0 | 0 |
smon timer | 2199 | 300 | 0 | 0 |
pmon timer | 2205 | 300 | 0 | 0 |
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# |
44733 | 25 | 200845 | 59 |
3:通过上面sql查找出来的对象编号找到对应的对象名称
SQL> select object_name from dba_objects where object_id in (44733);
OBJECT_NAME |
TMP_EQP_DETAIL |
和View
SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_name='TMP_EQP_DETAIL';
OWNER | OBJECT_NAME | OBJECT_ID | DATA_OBJECT_ID | OBJECT_TYPE |
LEGACY | TMP_EQP_DETAIL | 116177 | VIEW | |
PCTEST | TMP_EQP_DETAIL | 44733 | 47509 | TABLE |
SQL> select sid,sql_text from v$session a,v$sql b where sid in(2904) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);
SID | SQL_TEXT |
2094 | select eqp_master_id into :b0 from TMP_EQP_MASTER where eqp_id=:b1 |
2094 | update TMP_EQP_DETAIL set status='DOWN',err_code=:b0,err_desc=:b1,oper_id=:b2, time_stamp=to_date(:b3,'yyyymmddhh24miss'),i_insert_date=sysdate where (eqp_id=:b4 and pcbox_id=:b5) |
6:找一下对应sid产生的锁
a380
SQL> select SID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK from V$lock where block=1 or request<>0;
SID | TYPE | ID1 | ID2 | LMODE | REQUEST | CTIME | BLOCK |
2094 | TX | 458765 | 14122744 | 0 | 6 | 86073 | 0 |
2004 | TX | 458765 | 14122744 | 6 | 0 | 326041 | 1 |
解决方法:
1:通过v$session找到BLOCK=1的用户,告知用户提交事务
2:通过sid找到pid,kill掉该进程
3:更改sql语句,SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE no wait
加nowait的意思是得到或者得不到,不会等待
相关文章推荐
- ORACLE等待事件:enq: TX - row lock contention
- oracle等待事件实验--enq: TX - row lock contention
- enq: TX – row lock/index contention、allocate ITL等待事件
- ORACE_常见等待事件001_enq: TX - row lock contention
- enq: TX - row lock contention 等待事件
- 等待事件enq TX row lock contention分析
- enq: TX - row lock contention 等待事件
- enq: TX - row lock contention 等待事件
- enq: TX - row lock/index contention、allocate ITL等待事件
- enq: TX - row lock contention等待事件
- enq: TX - row lock contention“等待事件的处理
- enq TX row lock contention 锁等待事件解决案例一起
- enq: TX - row lock contention 等待事件
- 等待事件:enq: TX - row lock contention
- enq: TX - row lock contention 等待事件
- enq: TX - row lock contention 等待事件
- enq: TX - row lock contention“等待事件的处理
- enq: TX - row lock/index contention、allocate ITL等待事件
- Oracle enq: TX contention 和 enq: TM contention 等待事件说明【转自dave偶像大神】
- enq:SQ contention / row cache lock / DFS lock handle(SV) 等待事件 说明