数据库中v$lockv和$locked_object的区别有哪些

发布时间:2021-12-03 16:59:23 作者:小新
来源:亿速云 阅读:322

这篇文章给大家分享的是有关数据库中v$lockv和$locked_object的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、引言
工作中有次修改表sj_affair中的数据,需要禁用该表上的触发器。结果无法禁用,报如下错误:
ORA-00054: resource busy and acquire with NOWAIT specified
很明显,是该表被锁定了,于是打算kill掉锁住该表的会话。步骤如下:

1.查出锁住该表的会话id,serial#

SELECT o.object_name,s.sid, s.serial#
       FROM v$locked_object l, dba_objects o, v$session s
            WHERE l.object_id = o.object_id
                  AND l.session_id = s.sid
      AND o.object_name='SJ_AFFAIR';
      
2.kill掉该会话
alter system kill session 'sid, serial#';

kill掉会话之后再次查询,发现该表上已经没有锁了。于是再次试图禁用触发器,结果奇怪了,还是无法禁用。
是不是锁又恢复了呢?再次查询,发现没有锁。这是为什么呢?
在网上搜了很多,发现一条有用的信息,作者查询锁用的是v$lock视图,而不是v$locked_object视图。改成查询v$locd视图:

SELECT o.object_name,s.sid, s.serial#
       FROM v$lock l, dba_objects o, v$session s
            WHERE l.id1 = o.object_id
                  AND l.sid = s.sid
                  AND o.object_name='SJ_AFFAIR';
                  
然后再次查询,发现SJ_AFFAIR上居然还有锁。于是再次kill,然后禁用触发器就成功了。

二、V$LOCK和V$LOCKED_OBJECT
查询锁表都会用到V$LOCK和V$LOCKED_OBJECT,但这两者不是相同的。我们先看看它们各自的主要字段:
1.v$lock
    sid:     会话SID,通常与v$session关联。
    type:    锁类型,TM表示表锁或DML锁,TX表示行锁或事务锁,UL表示用户锁。我们主要关注TX和TM两种锁,其它均为系统锁,会很快自动释放,不用关注。  行锁不会单独存,行级锁之前需要先加表级共享锁。
  lmode:     会话保持的锁的模式。
 0=None;1=Null;2=Row-S (SS,行级共享锁,其他对象只能查询这些数据行);3=Row-X (SX,行级排它锁,在提交前不允许做DML操作);4=Share(共享锁);5=S/Row-X (SSX,共享行级排它锁);6=Exclusive(排它锁)
           
ID1,ID2: ID1,ID2的取值含义根据type的取值而有所不同,对于TM 锁ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0;对于TX 锁,ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER,ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
    
2.V$LOCKED_OBJECT
   session_id:         会话id。通常与v$session关联。
   object_id:          被锁对象标识。通常与dba_objects关联。
   oracle_username:    登录oracle用户名。
   os_user_name:       电脑用户名如:Administrator
   locked_mode:        会话保持的锁的模式。   
   
三、两者的区别
1.V$LOCKED_OBJECT只能报发生等待的表级锁,不能报发生等待的行级锁。
注:这句话是网上别人说的,暂时未验证,需慎重考虑。但是从我遇到的问题来看,似乎是正确的。只是我的问题已经无法重现,也就失去了验证它的机会。

2.v$locked_object包含的是当前DB中被锁住的OBJECT,而v$lock不仅包含用户的,还包括系统被锁住的object,即: V$LOCK>v$locked_object

感谢各位的阅读!关于“数据库中v$lockv和$locked_object的区别有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. system v 共享内存区
  2. php版本7和5区别有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据库 v$lockv $locked_object

上一篇:ADO.NET NextResult检索多个结果集怎么实现

下一篇:怎么解析KVM虚拟化原理中的CPU虚拟化

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》