DML锁
1、TX锁(事务锁)
Oracle中的锁定过程如下:
(1)找到想锁定的那一行的地址。
(2)到达那一行。
(3)锁定这一行(如果这一行已经锁定,则等待锁住它的事务结束,除非使用了NOWAIT选项)。
V$TRANSACTION,对应每个活动事务都包含一个条目。
V$SESSION,显示已经登录的会话。
V$LOCK,对应持有所有enqueue队列锁以及正在等待锁的会话,都分别包含一个条目。这
并不是说,对于表中被会话锁定的每一行,这个视图中就有相应的一行。你不会看到这种情况。如前所述,不存在行级锁的一个主列表。如果某个会话将EMP表中的一行锁定,V$LOCK视图中
就有对应这个会话的一行来指示这一事实。如果一个会话锁定了EMP表中的数百万行,V$LOCK视图中对应这个会话还是只有一行。这个视图显示了各个会话有哪些队列锁。
1、查询特定用户会话队列信息
selectusername,
v$lock.sid,
trunc(id1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0slot,
id2 seq,
lmode,
request
fromv$lock,v$session
wherev$lock.type='TX'
andv$lock.sid=v$session.sid
andv$session.username='WEIBIN';
(注:$LOCK表中的LMODE为6,REQUEST为0。如果在OracleServerReference手册中查看V$LOCK
表的定义,会发现LMODE=6是一个排他锁。请求(REQUEST)值为0则意味着你没有发出请求;
也就是说,你拥有这个锁。)
selectXIDUSN,XIDSLOT,XIDSQN
fromv$transaction;
2、查询哪个会话正阻塞了哪个会话
select(selectusernamefromv$sessionwheresid = a.sid) blocker,
a.sid,
'is blocking',
(selectusernamefromv$sessionwheresid = b.sid) blockee,
b.sid
fromv$lock a, v$lock b
wherea.block =1
andb.request >0
anda.id1 = b.id1
anda.id2 = b.id2;
2、TM锁(DML Enqueue)锁
TM锁(TMlock)用于确保在修改表的内容时,表的结构不会改变。例如,如果你已经更新了一个表,
会得到这个表的一个TM锁。这会防止另一个用户在该表上执行DROP或ALTER命令。如果你有表的一个TM
锁,而另一位用户试图在这个表上执行DDL,他就会得到以下错误消息:
droptabledept
*
ERRORat line1:
ORA-00054:resourcebusyandacquirewithNOWAITspecified
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25964700/viewspace-700303/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25964700/viewspace-700303/