Oracle “enq: TX - row lock contention 等待事件 ”

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产生的锁

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的意思是得到或者得不到,不会等待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值