ORACLE DML锁定机制

DML

1TX锁(事务锁)

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表中的LMODE6REQUEST0。如果在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;

2TM(DML Enqueue)

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

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

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

     droptabledept

                 *

     ERRORat line1:

     ORA-00054:resourcebusyandacquirewithNOWAITspecified

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

转载于:http://blog.itpub.net/24679076/viewspace-682450/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值