现在的位置: 首页 > 综合 > 正文

ORACE_常见等待事件001_enq: TX – row lock contention

2014年06月12日 ⁄ 综合 ⁄ 共 1989字 ⁄ 字号 评论关闭

enq: TX - row lock contention是oracle常见的等待事件之一。enq是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO)发生TX锁的原因一般有几个:
1.不同的session更新或删除同一个记录。
2.唯一索引有重复索引
3.位图索引多次更新
4.同时对同一个数据块更新
5.等待索引块分裂

本文只讨论第1中情况下等待事件的产生已经查看解决。

环境:
select * from v$version;

BANNER
1 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
2 PL/SQL Release 11.2.0.3.0 - Production
3 "CORE 11.2.0.3.0 Production"
4 TNS for Linux: Version 11.2.0.3.0 - Production
5 NLSRTL Version 11.2.0.3.0 - Production
以scott登录,打开两个会话,第一个会话执行以下sql:


update emp set job='clerk11' where empno=7369;

第二个会话执行以下sql:

update emp set job='clerk22' where empno=7369;


以sys用户打开第三个窗口查看当前非系统session有哪些等待事件:


select s.sid, --sid
s.p1, --参数p1
s.p2, --参数p2
s.p3, --参数p3
s.event, --等待事件名称
s.ROW_WAIT_OBJ#, --等待对象名称
s.ROW_WAIT_FILE#, --等待文件号
s.ROW_WAIT_BLOCK#, --等待块号
s.ROW_WAIT_ROW#, --等待块中行号
s.WAIT_TIME, --等待时间
s.EVENT#, --等待事件号
s.sql_id, --sql_id
s.lockwait, --等待锁
s.command, --sql类型
s.WAIT_CLASS#, --等待事件类别号
s.WAIT_CLASS_ID, --等待事件类别id
s.WAIT_CLASS --等待事件类别
from v$session s
where s.username is not null
and s.event not like '%SQL*Net message from client%'
and s.event not like '%SQL*Net message to client%';


SID 30
P1 1415053318
P2 393229
P3 7074
EVENT enq: TX - row lock contention
ROW_WAIT_OBJ# 75335
ROW_WAIT_FILE# 4
ROW_WAIT_BLOCK# 151
ROW_WAIT_ROW# 0
WAIT_TIME 0
EVENT# 240
SQL_ID ay2btuzusf629
LOCKWAIT 000000009CC689E8
COMMAND 6
WAIT_CLASS# 1
WAIT_CLASS_ID 4217450380
WAIT_CLASS Application

根据上面等待的session的信息查看等待sql:

select s.SQL_TEXT,s.SQL_ID from v$sql s where sql_id='ay2btuzusf629';
SQL_TEXT update emp set job='clerk22' where empno=7369
SQL_ID ay2btuzusf629

查看等待的对象的信息:

select o.OWNER, o.OBJECT_NAME, o.OBJECT_ID, o.DATA_OBJECT_ID, o.OBJECT_TYPE
from all_objects o
where o.object_id = 75335;

OWNER SCOTT
OBJECT_NAME EMP
OBJECT_ID 75335
DATA_OBJECT_ID 75335
OBJECT_TYPE TABLE

查看锁信息:

select l.TYPE, --锁类型 TX-Transaction enqueue TM-DML enqueue 这两个为用户锁 AE-系统锁
l.LMODE, --锁模式
l.CTIME, --锁的时间
l.BLOCK --是否同时造成其他锁
from v$lock l
where l.SID = 30;
TYPE TX
LMODE 0
CTIME 7745
BLOCK 0

以上等待事件信息的产生就是session 2(sid=30)更新session 1(sid=1)未提交的数据产生的。解决办法有:

1.session 1 commit或者rollback dml更新。

2.根据sid ,kill session 2:

select sid,serial# from v$session where sid=30;

SID 30
SERIAL# 19

执行:ALTER SYSTEM KILL SESSION '30,19';

抱歉!评论已关闭.