v$lock表:
官方文档很详细
几种模式:
row exclusive 这个锁定模式发生在更新表的一行或者多行时出现,就是tx锁的exclusive模式。
share lock 这个模式的锁定只允许别的事务查询或者锁定特定的记录,不能够delete,update,insert;
share row exclusive 用于查看整个表,不允许别的事务以share模式锁定表或更新表中的记录,只允许带update的select语句。
exclusive 事务以独占的方式写一个表,不允许DML。
常用的锁定判断查询:
select id1,id2,sid,type,decode(lmode,0,'none',1,'null',2,'row share',3,'row exclusive',4,'share',5,'share row exclusive',6,'exclusive') lmode,decode(request,0,'none',1,'null',2,'row share',3,'row exclusive',4,'share',5,'share row exclusive',6,'exclusive') request,ctime,block from v$lock;
注意的id1,id2是依赖于type字段的,type字段常见的两种类型tm(表级锁),tx(行级锁),一般tx锁只有exclusive模式,例如 :
当我们发出一条update 语句时,就会出现tm和tx两个锁:
update emp set sal=20000 where ename='SCOTT';
SQL> select * from v$lock where sid=(select sid from v$mystat where rownum<=1);
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
1EDC4074 1EDC408C 158 TM 52785 0 3 0 78 0 ##注解:sid为用户的v$session中对应的sid,type是表级锁,id1为锁定表的object_id,id2在tm类型时始终为 0,request为对应锁的争用。ctime对应该用户执有该锁定的时间,一般是3秒更新一次这个字段,block显示锁定是否阻塞了相应的锁定。
1EE12294 1EE123B0 158 TX 327695 637 6 0 78 0 ##tx行级锁只有exclusive模式,id1,id2对应回滚段和slot号(在v$transaction视图中可以看出),经过相应的转换可以得到,在韩思捷的10G OCP中有转换过程。
SQL> select xidusn,xidslot,xidsqn,status from v$transaction;
XIDUSN XIDSLOT XIDSQN STATUS
---------- ---------- ---------- ----------------
5 15 637 ACTIVE
SQL> select * from v$locked_object;
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE
---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------ -----------
5 15 637 52785 158 SYS LY0110RJP\Administrator 764:2956 3
process字段对应是操作系统号764,打开“任务管理器”,查看pid为764对应的进程就是sqlplus。
如果几个session发生锁争用,那么会记录到v$enqueue_lock视图中:
sys用户下: update scott.emp set sal=20000 where ename='SCOTT';
scott用户下: update scott.emp set sal=20000 where ename='SCOTT';
SQL> select * from v$lock;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
1EDC4074 1EDC408C 158 TM 52785 0 3 0 12 0
1EDC4138 1EDC4150 159 TM 52785 0 3 0 9 0
1EE29A54 1EE29B70 158 TX 196644 662 6 0 12 1
看到sid为158即sys的锁block了159的锁定要求。
SQL> select * from v$enqueue_lock;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
1F834394 1F8343A8 159 TX 196644 662 0 6 309 0
159被阻塞,oracle将其放入队列中,这里的锁定lmode为0,即none,因为session还未获得请求的锁定,而它需要(request)的是6即tx行级专有锁。
另外还有一个v$locked_object显示出当前被锁定的对象:
SQL> select * from v$locked_object;
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE
---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------ -----------
3 36 662 52785 158 SYS LY0110RJP\Administrator 764:2956 3
0 0 0 52785 159 SCOTT LY0110RJP\Administrator 3276:3280 3
看到sid为159的xidusn,xidslot,xidsqn都为0,因为事务被阻塞了,不能获得回滚段和slot槽。
Lock table emp in share mode nowait;
如果锁定的是视图的话,且视图包含多个基表,那么oracle会同时锁住几个基表:
SQL> create view test01 as select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno;
视图已创建。
SQL> lock table test01 in share mode;
表已锁定。
如果这时我们再尝试锁定相应基表的话,可能被阻塞。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23102627/viewspace-659991/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23102627/viewspace-659991/