ITPub博客

首页 > 数据库 > Oracle > ORACLE DML锁定机制

ORACLE DML锁定机制

原创 Oracle 作者:passion_of_data 时间:2011-06-20 16:45:18 0 删除 编辑

DML

1TX锁(事务锁)

Oracle中的锁定过程如下:

   (1)找到想锁定的那一行的地址。

   (2)到达那一行。

       (3)锁定这一行(如果这一行已经锁定,则等待锁住它的事务结束,除非使用了NOWAIT选项)。

V$TRANSACTION,对应每个活动事务都包含一个条目。

V$SESSION,显示已经登录的会话。

V$LOCK,对应持有所有enqueue队列锁以及正在等待锁的会话,都分别包含一个条目。这

并不是说,对于表中被会话锁定的每一行,这个视图中就有相应的一行。你不会看到这种情况。如前所述,不存在行级锁的一个主列表。如果某个会话将EMP表中的一行锁定,V$LOCK视图中

就有对应这个会话的一行来指示这一事实。如果一个会话锁定了EMP表中的数百万行,V$LOCK视图中对应这个会话还是只有一行。这个视图显示了各个会话有哪些队列锁。

 

1、查询特定用户会话队列信息

selectusername,

v$lock.sid,

trunc(id1/power(2,16)) rbs,

bitand(id1,to_number('ffff','xxxx'))+0slot,

id2 seq,

lmode,

request

fromv$lock,v$session

wherev$lock.type='TX'

andv$lock.sid=v$session.sid

andv$session.username='WEIBIN';

(注:$LOCK表中的LMODE6REQUEST0。如果在OracleServerReference手册中查看V$LOCK

   表的定义,会发现LMODE=6是一个排他锁。请求(REQUEST)值为0则意味着你没有发出请求;

   也就是说,你拥有这个锁。)

 selectXIDUSN,XIDSLOT,XIDSQN

fromv$transaction;

2、查询哪个会话正阻塞了哪个会话

select(selectusernamefromv$sessionwheresid = a.sid) blocker,

      a.sid,

      'is blocking',

      (selectusernamefromv$sessionwheresid = b.sid) blockee,

      b.sid

 fromv$lock a, v$lock b

 wherea.block =1

  andb.request >0

  anda.id1 = b.id1

  anda.id2 = b.id2;

2TM(DML Enqueue)

TM锁(TMlock)用于确保在修改表的内容时,表的结构不会改变。例如,如果你已经更新了一个表,

会得到这个表的一个TM锁。这会防止另一个用户在该表上执行DROPALTER命令。如果你有表的一个TM

锁,而另一位用户试图在这个表上执行DDL,他就会得到以下错误消息:

    droptabledept

                *

    ERRORat line1:

    ORA-00054:resourcebusyandacquirewithNOWAITspecified


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25964700/viewspace-700303/,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle巡检(转)
请登录后发表评论 登录
全部评论
DBA

注册时间:2011-06-20

  • 博文量
    53
  • 访问量
    308733