您的位置:首页 > 数据库 > Oracle

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%';

EVENTSIDP1P2P3
db file sequential read2061259059781
enq: TX - row lock contention2094141505331845876514122744
Streams AQ: waiting for messages in the queue2126468631.38351E+192147483647
Streams AQ: waiting for messages in the queue2132468411.38351E+192147483647
Streams AQ: waiting for messages in the queue2133468401.38351E+192147483647
Streams AQ: waiting for messages in the queue2154468621.38351E+192147483647
Streams AQ: qmn slave idle wait2182000
Streams AQ: qmn coordinator idle wait2184000
Streams AQ: waiting for time management or cleanup tasks2193000
smon timer219930000
pmon timer220530000
上面的等待事件说明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';

ROW_WAIT_OBJ#ROW_WAIT_FILE#ROW_WAIT_BLOCK#ROW_WAIT_ROW#
447332520084559
 
3:通过上面sql查找出来的对象编号找到对应的对象名称

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

OBJECT_NAME
TMP_EQP_DETAIL
4:通过对象名称找出该对象的对应属性,TABLE
和View

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

OWNEROBJECT_NAMEOBJECT_IDDATA_OBJECT_IDOBJECT_TYPE
LEGACYTMP_EQP_DETAIL116177 VIEW
PCTESTTMP_EQP_DETAIL4473347509TABLE
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);

SIDSQL_TEXT
2094select eqp_master_id into :b0  from TMP_EQP_MASTER where eqp_id=:b1
2094update 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)
从上面的结果可以看出,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;

SIDTYPEID1ID2LMODEREQUESTCTIMEBLOCK
2094TX4587651412274406860730
2004TX45876514122744603260411
由此可以查看,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的意思是得到或者得不到,不会等待
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: