oracle锁

本文深入探讨了Oracle数据库中的事务管理与锁机制,包括如何通过SQL查询获取相关事务和锁信息,以及如何理解事务ID、阻塞情况等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--对应每个活动事务都包含一个条目
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'));

转载于:https://my.oschina.net/u/729507/blog/129279

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值