您的位置:首页 > 其它

来,锁个痛快(6)―― 与lock相关的视图和简单实验

2011-08-25 22:08 169 查看
上篇算是对lock做了一个概述,相信大家对lock也有了一定的了解,但是锁的冲突自然是不希望被看到的,那通过动态视图我们可以更加详尽地了解当前lock的情况并且进行处理,如何及时地判断锁定的情况以及及时地kill掉一些提交了引起锁定的事务的session也应该是DBA的一个重要的技能。
v$lock自然是毫无疑问最为重要的与lock相关的视图了,这个视图将记录当前session已经获得的锁定已经正在等待的锁定的信息,其中比较常用的列如下:

sid:当前session的id
type:锁的类型,类似于TX锁或者TM锁
LMODE:已经获得的锁的具体模式,是以编码形式的。
REQUEST:正在请求的锁的具体模式,也是以编码形式的。
具体来说是这样的,按照数值的高低来表示锁的级别,数值越高是说明锁的级别越高,也就说明兼容性越差。
那根据我上篇锁介绍的锁的类型再加上一个NULL和空一共有7个级别的模式如下:
0:空,代表没有任何操作
1:NULL,和空有区别,select的时候是NULL而不是空
2:RS锁 3:RX锁 4:S锁 5:SRX锁 6:X锁
ID1、ID2:锁的对象标识。对于TX锁来说我们暂时不管,对于TM锁来说ID1就是被锁的对象的对象号,可以去dba_objects表里面去查对应的被锁的对象的对象名,对于TM锁来说ID2总是为0.
BLOCK:是否阻止了其他用户获得锁定,大于0表示是,等于0说明否。
除了这个视图之外呢,还有v$locked_object,记录的是被锁住的对象的信息
比较重要的字段如下:
XIDUSN:回滚段号 XIDSLOT:槽号 XIDSQN:序列号 那这三个都是和回滚相关的,放在一边,锁和回滚的关系我们留待回滚的专辑再详述,反正oracle为了保证读一致性,在DML肯定会有回滚相关的处理。要注意,这些信息都是针对事务也就是transaction而言的。
OBJECT_ID:被锁对象ID
SESSION_ID:持有锁的sessionID
ORACLE_USERNAME:持有锁的Oracle 用户名
OS_USER_NAME:持有锁的操作系统 用户名
PROCESS:操作系统进程号
LOCKED_MODE:锁模式,和v$lock中的LMODE和REQUEST是相同的。
还有一个是v$enqueue_lock,这个表的字段和v$lock中的字段是一样的,不过这个表中只存放那些申请锁定失败然后再等待的session信息,按时间先后顺序排列,先申请锁定的session排在前面,也将会更早地获得锁定。
这些视图和v$session配合将可以显示更加具体的session的信息并且解决一定程度的冲突,有了理论以后我们来做个简单的小实验,来看看lock相关视图中最重要的v$lock的最简单的使用。
首先,先要查看到当前session的id。有两种办法,都很简单,图如下:



然后随便输入一句dml语句,o小白还是用update test set id = 3 where id = 2;
然后运行下面的sql语句,

看到结果如下:



很清楚了,一个TM锁,和理论符合的RX锁,一个是TX锁X,然后TM锁的ID1拿出来,去dba_objects里面应该可以查到该表的表名,那这里不做演示了。
然后我们再开一个session模拟锁定情况。sid = 15,运行语句update test set id = 4 where id = 2;
而刚的语句sid = 134,改成sid in (134,159),运行后结果如下:



可以看到,159正在请求行级的X锁,是被134的行级锁锁定的,但是RX锁之间是没有锁定的,不知道这个实验是不是可以让大家更加清楚RX锁和TX锁里的X锁的区别,RX锁只是说明有行在被更新,从而阻止X锁,至于行和行是不是冲突是看TX锁的。
再来看看v$enqueue_lock,再开一个session id = 147,执行和159相同的命令,然后查询锁的sql语句中简单把查询对象从v$lock变成v$enqueue_lock并且指定sid为两个锁住的session的id,结果如下:



也和理论相符合,两个都是等待TX锁,而且159首先请求,所以排在上面,解开锁定的时候自然也是159先获得锁定。
然后我们kill掉阻塞的进程,首先还必须获得session的serial#,可以这样
select serial# from v$session where sid = 134;得到结果370
然后运行命令alter system kill session ‘134,370’;
图就不贴了,成功kill掉以后可以看到159的DML语句就可以顺利执行了。
至于其他的视图的配合应用,包括v$locked_object啊大家可以自己尝试,也可以通过Google找到一些例子来实验一下,应该还是会收获颇丰的。
本文出自 “oracle小白前进之路” 博客,请务必保留此出处http://oxiaobai.blog.51cto.com/3369332/648939
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: