您在这里:首页 > 学员专区 > 技术文章
Oracle视频
Oracle
CUUG课程

Oracle八大性能视图之v$lock

 

SQL> desc v$lock;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 ADDR                                               RAW(8)

 KADDR                                              RAW(8)

 SID                                                NUMBER

 TYPE                                               VARCHAR2(2)

 ID1                                                NUMBER

 ID2                                                NUMBER

 LMODE                                              NUMBER

 REQUEST                                            NUMBER

 CTIME                                              NUMBER

 BLOCK                                              NUMBER

锁的分类:

0、无

1、NULL,可以某些情况下,如分布式数据库的查询会产生此锁。

2、SS,表结构共享锁

3、SX,表结构共享锁+被操作的记录的排它锁

4、S, 表结构共享锁+所有记录共享锁

5、SRX 表结构共享锁+所有记录排它锁

6、X   表结构排它锁+所有记录排它锁

表上的5种锁的含义:

RS(SS):是一种纯粹的意向锁,它表征事务要通过SELECT FOR UPDATE访问某些行;

RX(SX):是一种纯粹的意向锁,它表征事务要通过 UPDATE/ DELETE/INSERT修改某些行;

S:全表范围的共享锁,不需要在每行上做出标识;

X:全表范围的排它锁,不需要在每行上做出标识;

SRX(SSX):是意向锁RX与S锁的组合,它表征事务既对表加S锁,同时要修改个别行,即要在个别行上加X锁;(如果你使用ORACLE8,可以在一个表上建立一个自引用,如EMP表上的MGR引用EMPNO,删除一条记录,可以观察到SRX锁)

在行上,ORALCE只有X锁,

但由SELECT FOR UPDATE 获得的X锁在表级表征为RS锁,

由INSERT/UPDATE/DELETE 获得的X锁在表级表征为RX锁,

 

窗口1:

SQL> conn myfmis/myfmis

已连接。

SQL> update xtdwcs set MC='单位本部ok' where dh='0114';

窗口2:

SQL> conn myfmis/myfmis

已连接。

SQL> update xtdwcs set MC=单位本部ok' where dh='0114';

处理过程:

查看是否有session阻塞:

select * from v$lock where BLOCK=1

    ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

1 1FE0C654 1FE0C770 151 TX 131115 520 6 0 669 1

查看TX锁的SID与Serial#:

select * from v$session where event like'%TX%';

select sid,serial#,username,state,blocking_session_status,blocking_session from v$session where event like'%TX%';

 

    SID SERIAL# USERNAME STATE BLOCKING_SESSION_STATUS BLOCKING_SESSION

1 137 6 FMISMAIN WAITING VALID 150

临时KILL这个session:

分两类,

第一:kill掉137,6,则是kill掉之后被等的session。

alter system kill session '137,6';

第二:kill掉150,则是kill掉之前阻塞别人的session。

因此通过前面的137,6所查到的SQL语句,则是后面运行被等待的SQL语句,而不是阻塞别人的SQL语句。

如果要查找原因,操作如下:

查找相应的SQL语句:

select a.sql_text from v$sqlarea a,v$session b where a.sql_id=b.sql_id

select a.sql_text from v$sqlarea a,v$session b where a.sql_id=b.sql_id and b.event like'%TX%'

 

    SQL_TEXT

1 update xtdwcs set MC='单位本部ok'  where dh='0114'

select * from v$sqlarea where SQL_ID='gf1472pj5wnzj'

找出相应的SQL语句后,即可处理。

#######################################################################

在巡检期间,检查如果发现有相关的session_wait锁,可按以下步骤查找相应的锁

1. 使用V$LOCK找出session持有的锁。

2. 使用V$SESSION找出持有锁或等待锁的session执行的sql语句。

3. 使用V$SESSION_WAIT找出什么原因导致session持有锁堵塞。

4. 使用V$SESSION获取关于持有锁的程序和用户的更多信息。

V$LOCK中的常用列

? SID:表示持有锁的会话信息。

? TYPE:表示锁的类型。值包括TM和TX等。

? LMODE:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。

? REQUEST:表示session请求的锁模式的信息。

? ID1,ID2:表示锁的对象标识。

1、查看相应的v$session_wait信息

    select event,count(*) from V$SESSION_WAIT group by event order by count(*) desc;

    select event,count(*) from V$SESSION_WAIT group by event order by count(*) asc;

如果如下(第3条):

    EVENT COUNT(*)

1 smon timer 1

2 Streams AQ: qmn coordinator idle wait 1

3 enq: TX - row lock contention 1

4 jobq slave wait 1

5 Streams AQ: waiting for time management or cleanup tasks 1

6 pmon timer 1

7 Streams AQ: qmn slave idle wait 1

8 SQL*Net message from client 3

9 rdbms ipc message 9

 

查看当前被锁的session正在执行的sql语句

select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"

from v$session a, v$lock b, v$sqltext c

where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value

相关文章 [上一篇] Oracle八大性能视图之v$sqlarea
010-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号