oracle锁

--对应每个活动事务都包含一个条目
SELECT * FROM V$TRANSACTION;
--显示已经登录的会话
SELECT * FROM V$SESSION;
--对应持有所有enqueue队列锁以及正在等待锁的会话,都分别包含一个条目
SELECT * FROM V$LOCK;

select username,
v$lock.sid,
osuser,
trunc(id1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0 slot,
id2 seq,
lmode,
request
from v$lock, v$session
where v$lock.type = 'TX' and osuser = upper('lixiaobing001');


select XIDUSN, XIDSLOT, XIDSQN
 from v$transaction;

V$LOCK表更应算是一个队列表而不是一个锁表。许多人都认为V$LOCK中会有4行,因为我们锁定了4行。不过,你要记住,Oracle不会在任何地方存储行级锁的列表(也就是说,不会为每一个被锁定的行维护一个主列表)。要查看某一行是否被锁定,必须直接找到这一行

$LOCK表中的LMODE为6,REQUEST为0。如果在Oracle Server Reference手册中查看V$LOCK表的定义,会发现LMODE=6是一个排他锁。请求(REQUEST)值为0则意味着你没有发出请求;也就是说,你拥有这个锁

RBS、SLOT和SEQ值与V$TRANSACTION信息匹配。这就是我的事务ID

 --谁阻塞了谁

select
(select username from v$session where sid=a.sid) blocker,
a.sid,
(select osuser from v$session where sid=a.sid) blocke_osr,
' is blocking ',
(select osuser from v$session where sid=b.sid) blockee_os,
(select username from v$session where sid=b.sid) blockee,
b.sid
from v$lock a, v$lock b
where a.block = 1
and b.request > 0
 and a.id1 = b.id1
 and a.id2 = b.id2;

 

 select (select username
from v$session
where sid = v$lock.sid) username,
sid,
id1,
id2,
lmode,
request, block, v$lock.type
from v$lock
 where sid = (select sid
 from v$mystat
 where rownum=1);
 
 select object_name, object_id
from user_objects
where object_name in (upper('t_lxb_test_batch'));

你可能感兴趣的:(oracle锁)