v$lockv和$locked_object的区别

url: http://blog.sina.com.cn/s/blog_62defbef0101pgvo.html

2013-12-24 v1.0

一、引言

工作中有次修改表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. hive中left join、left outer join和left semi join的区别

    先说结论,再举例子.   hive中,left join与left outer join等价.   left semi join与left outer join的区别:left semi join相当 ...

  2. python simplejson and json 使用及区别

    ''' import simplejson as json #几个主要函数:dump.dumps.load.loads,带s跟不带s的区别: 带s的是对 字符串的处理,而不带 s的是对文件对像的处理. ...

  3. 转:oracle几组重要的常见视图-v$latch,v$latch_children,v$lock,v$locked_object

    v$latch Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串行化锁定机制.Latch的实现是与操作系统相关的, 尤 ...

  4. lua-遍历集合-ipairs和pairs的区别

    --ipairs和pairs的区别arr = {1,3,[5]=5,name="kaikai",age=12, 89}--arr[4]= 23--ipairs--ipairs仅仅遍 ...

  5. linux命令kill和kill -9的区别

    linux命令kill和kill -9的区别 2018年04月13日 16:53:07 坠入苦海销尘垢 阅读数 2854   转载自https://www.cnblogs.com/liuhouhou/ ...

  6. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  7. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  8. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  9. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

随机推荐

  1. doris 0.9.0版本docker镜像制作与使用

    1. 安装docker 详情请参见本人博客 2. 编译doris 详情请参见doris官网文档 3. 在编译好的doris output文件夹下编写两个Dockerfile 3.1  Dockerfi ...

  2. docker 在windows7 、8下的安装

    这里说明一下这种安装方式适合win7 win8的系统环境下安装的,当然win10也可以,但是win10有更好的方式 即安装Docker Toolbox,同时还附加安装 Docker Client fo ...

  3. 【亲测】关于HTTP协议~

    如果有一点点基本的开发者工具基础知识,我们知道:Elements是用来查看网页结构的,也就是可以看到整体的HTML语言:Console是控制台,Network是请求想相应状态. 1)一个Name就是一 ...

  4. 多端统一框架尝试--Taro

    参考资料 Taro官网Taro GitHubTaro资源汇总Taro-UI 我的demo代码 github地址 Taro介绍和尝试心得 Taro是基于React语法规范开发的多端统一的框架,一套代码可 ...

  5. profile default

    SAPDBHOST = 10.199.0.26 j2ee/dbtype = hdb j2ee/dbname = ISD j2ee/dbhost = 10.199.0.26 dbs/hdb/dbname ...

  6. 面试回顾——List<T>排序

    1.如何对List<T>排序: public static void main(String[] args) { Student stu1=new Student("张三&quo ...

  7. Entity Frame Code First 简易教程

    简介 什么是ORM 搭建Entity FrameWork CodeFirst应用 数据库迁移 表属性常见配置 Entity FrameWork 一对多.多对多 一.简介 Entity Framewor ...

  8. 触发full gc的条件

    1.调用System.gc 2.老年代空间不足 3.永生区空间不足 4.CMS GC时出现promotion failed和concurrent mode failure 5.统计得到的Minor G ...

  9. SSH登录启用Google二次身份验证

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  10. linux下redis4.0.2集群部署(利用原生命令)

    一.部署架构如下 每台服务器准备2个节点,一主一从,主节点为另外两台其中一台的主,从节点为另外两台其中一台的从. 二.准备6个节点配置文件 在172.28.18.75上操作 cd /etc/redis ...