ORACLE关于锁和V$LOCK的分析

转载 2016年09月29日 17:27:14

    为了实现并发,oracle数据库使用了锁机制。要了解锁,首先要了解视图v$lock。
v$lock这个视图列出 Oracle 服务器当前拥有的锁以及未完成的锁请求。如果你觉着 session 处于等待事件队列当中,那你应该检查视图v$lock。

v$lock中的常用列有以下列:
     sid:持有锁的会话SID,通常与v$session关联。

     type:锁的类型,其中TM表示表锁或DML锁,TX表示行锁或事务锁,UL表示用户锁。我们主要关注TX和TM两种型的锁,其它均为系统锁,会很快自动释放,不用关注。当 Oracle执行 DML 语句时,系统自动在所要操作的表上申请 TM 类型的锁。当 TM锁获得后,系统再自动申请 TX 类型的锁,并将实际锁定的数据行的锁标志位进行置位。TM 锁包括了SS 、 SX、 S 、X 等多种模式,在数据库中用 0 -6 来表示。不同的 SQL 操作产生不同类型的 TM锁。

     lmode:会话保持的锁的模式。
          0=None;
          1=Null ;
          2=Row-S (SS,行级共享锁,其他对象SQL语句只能查询这些数据行),sql操作有select for update、lock for update、lock row share;
          3=Row-X (SX,行级排它锁,在提交前不允许做DML操作),sql操作有insert、update、delete、lock row share;
          4=Share(共享锁),sql操作有create index、lock share;
          5=S/Row-X (SSX,共享行级排它锁),sql操作有lock share row exclusive;??
          6=Exclusive(排它锁),alter table、drop table、drop index、truncate table、look exclusive等DDL
     注释:Row-S (SS,行级共享锁)和Row-X (SX,行级排它锁)中的第一个S 表示表被共享,如果表不被共享,就谈不上其下级的行级锁是否被共享还是排他了。表级别为X,行级锁就不被其他会话访问,所以也就没XX或XS模式,只有X模式。

     ID1,ID2:  ID1,ID2的取值含义根据type的取值而有所不同,对于TM 锁ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0(即表示type=TM时,用不到ID2列,故将其置为零;对于TX 锁ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER,ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数。实际上这两个字段构成了事务在回滚段中的位置。

当锁产生时,以下图为例说明v$lock:
1、图中存在两个session分别是133和135,session135的BLOCK=1意味着该session拥有一个锁,并阻塞了其他session的对该锁的请求。该锁的类型由TY定义,模式由LMODE字段定义;
2、session133的request=6说明该session正在等待一个lmode为6的锁,而该锁的拥有者正是session135。
3、对于TM锁,ID1Z值就是加锁的段对象,可以是表或者表分区,此时ID2一般为0;对于TX锁,这两个字段构成该事务在回滚段中的位置。

对于死锁的处理流程:
1,查找锁:
select ls.osuser os_user_name,
ls.username user_name,
ls.type lock_type,
o.object_name object,
decode(ls.lmode,1,null,2,'Row Share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive',null) lock_mode,
o.owner,
ls.sid,
ls.serial# serial_num,
ls.id1,ls.id2,
ls.paddr
 from sys.dba_objects o,
(select s.osuser,s.username,l.type,s.paddr,l.lmode,s.sid,s.serial#,l.id1,l.id2  from v$session s,v$lock l where s.sid=l.sid) ls
where o.object_id=ls.id1 and o.owner<>'SYS' order by o.owner,o.object_name
2,查找spid
select a.spid,a.username,b.program  from v$process a,v$session b where a.addr=b.paddr and a.addr='000007FF2DC8E578';
3、kill进程
alter system kill session 'sid,serial#' immediate;
orakill sid spid
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即第2步查询出的spid。     
参考:
oracle v lock详解 百度
oracle 锁表 解锁 百度

相关文章推荐

ORACLE关于锁和V$LOCK的分析

ORACLE关于锁和V$LOCK的分析      为了实现并发,oracle数据库使用了锁机制。要了解锁,首先要了解视图v$lock。 v$lock这个视图列出 O...

访问V$LOCK视图oracle11g出现性能问题

最近发现oracle11g有个问题,拿出来和大家讨论。是在Oracle 11.2.0.3 For Linux X64环境中。   检查数据库是否存在锁信息,在查询V$LOCK视图时发现很长时间没...

Oracle 动态性能视图之V$LOCK

Oracle 动态性能视图之V$LOCK  (2011-06-23 15:37:51) 转载▼ 标签:  oracle   vlock   杂谈 ...

电脑锁Lock My PC V4.7

  • 2013年06月04日 22:34
  • 1.16MB
  • 下载

Oracle中的锁(LOCK)机制

本文结合示例简要的介绍了一下Oracle中锁的机制。

一键重力感应锁orientation lock v3.0

  • 2013年02月05日 15:48
  • 310KB
  • 下载

oracle lock 08 - 关于锁的解决方案

v$lock V$LOCK lists the locks currently held by the Oracle Database and outstanding requests for a ...

[Oracle] 锁(Lock)的探讨

1、锁(Lock)的原则 Oracle当中的锁通常是业务层面的问题,锁是为了在并发的情况下保证数据库的一致性,因此没有并发就没有锁。Oracle的锁有如下几个原则: 只有被修改时,行才会被...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE关于锁和V$LOCK的分析
举报原因:
原因补充:

(最多只允许输入30个字)