美文网首页
v$lockv和$locked_object

v$lockv和$locked_object

作者: 若有所思11 | 来源:发表于2019-12-25 15:09 被阅读0次

一、引言

工作中有次修改表xxxxx中的数据,需要禁用该表上的触发器。结果无法禁用,报如下错误:
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='xxxxx';

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

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='xxxxx';

然后再次查询,发现xxxxx上居然还有锁。于是再次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

    一、引言 工作中有次修改表xxxxx中的数据,需要禁用该表上的触发器。结果无法禁用,报如下错误:ora-00054...

  • 杀死oracle进程

    SQL> select session_id from v$locked_object; SESSION_ID -...

  • [Oracle]使用sid和sessionid杀死进程

    select session_id from v$locked_object; SELECT sid, seria...

  • 数据库锁--用户操作

    数据库锁: --查被锁的session SELECT * FROM V$LOCKED_OBJECT T; --se...

  • Oracle解决死锁问题

    --查找死锁会话idselectsession_idfromv$locked_object;--根据会话id查找死...

  • v-if 和 v-for

    一、不应同时使用v-for和v-if不应该一起使用。原因:v-for比v-if优先,即每一次都需要遍历整个数组,影...

  • v-if 和 v-for

    当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,通过 v-if 移动到容器元素,不会再重复遍历...

  • v-for 和 v-if

    比较 v-for 比 v-if 优先执行,如果一起用会造成性能浪费,可 v-for 外嵌套 v-if 使用。 如果...

  • VUE语法入门

    一、HelloWorld 二、阻止表单提交 三、v-test和v-html 四、v-if和v-show 五、v-o...

  • 2018-09-16第四课 (v-html和v-text的区别,

    1.v-html和v-text的区别 v-html可解析标签;v-text正常文本输出; 2.v-once和v-p...

网友评论

      本文标题:v$lockv和$locked_object

      本文链接:https://www.haomeiwen.com/subject/vpycoctx.html