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. Vue--生命周期函数

    生命周期函数就是组件挂载.以及组件销毁的时候触发的一系列方法,这些方法叫做生命周期函数: beforeCreate(){ console.log('实例创建之前-1') }, created(){ c ...

  2. IDEA导入Eclipse项目

    目录 一.导入项目 二.启动项目 一.导入项目 1.欢迎界面,选择Import Project 2.选择源码的位置,点击OK 3.选择Eclipse模型,点击Next 4.默认选择,点击Next 5. ...

  3. 目标检测框架py-faster-rcnn修改anchor_box

    众所周知,anchor_box控制了回归框的大小,我们有时候检测的是大物体或小物体时,需要调整回归框的大小的时候,得改一下anchor_box.基于rgb公开的py-faster-rcnn修改anch ...

  4. Rabbitmq 与springboot 结合

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  5. i386 x86_64 armv7 arm64

    arm7: Used in the oldest iOS 7-supporting devices arm7s: As used in iPhone 5 and 5C arm64: For the 6 ...

  6. mongodb mongod 启动参数

    我们可以通过mongod --help查看mongod的所有参数说明,以下是各参数的中文解释. 基本配置 –quiet# 安静输出 –port arg# 指定服务端口号,默认端口27017 –bind ...

  7. javaMail实现收发邮件(三)

    JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的实例对象封装了某种邮件发送协议的底层实施细节,应用程序调用这个类中的方法就可以把Mes ...

  8. const命令声明变量应注意的几点

    对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址.const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心. const person = ...

  9. c++ 面试题(网络类)

    1,若服务器方单独终止之后,客户端继续发数据会怎么样? https://blog.csdn.net/Nick_666/article/details/78342442 https://www.zhih ...

  10. Linux上web服务器搭建

    安装php依赖包: yum -y install gcc gcc++ libxml2 libxml2-devel yum install gcc make gd-devel libjpeg-devel ...