ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE DML锁定机制

ORACLE DML锁定机制

原创 Linux操作系统 作者:数据中的安逸 时间:2010-12-23 10:38:52 0 删除 编辑

DML锁

1、TX锁(事务锁)

Oracle中的锁定过程如下:

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

    (2)到达那一行。

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

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

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

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

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

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

 

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

select username,

v$lock.sid,

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

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

id2 seq,

lmode,

request

from v$lock,v$session

where v$lock.type='TX'

and v$lock.sid=v$session.sid

and v$session.username='WEIBIN';

(注:$LOCK表中的LMODE为6,REQUEST为0。如果在OracleServerReference手册中查看V$LOCK

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

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

 select XIDUSN,XIDSLOT,XIDSQN

from v$transaction;

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

select (select username from v$session where sid = a.sid) blocker,

       a.sid,

       'is blocking',

       (select username from v$session where sid = b.sid) blockee,

       b.sid

  from v$lock a, v$lock b

 where a.block = 1

   and b.request > 0

   and a.id1 = b.id1

   and a.id2 = b.id2;

2、TM锁(DML Enqueue)锁

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

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

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

     droptabledept

                 *

     ERRORat line1:

     ORA-00054:resourcebusyandacquirewithNOWAITspecified

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

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

注册时间:2010-09-29

  • 博文量
    9
  • 访问量
    11801