LOCK(2)-TM LOCK

来源:互联网 发布:删除表里数据 sql语句 编辑:程序博客网 时间:2024/04/29 23:26

 

  1. TM(DML Enqueue)
    1. 修改内容的时候,结构是不应该被修改的.这是通过TM锁实现的.
      Session1:  delete u1.t1;
      Session2:  drop u1.t1
      drop table u1.t1

              *

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified


这个错误提示nowait是没意义的(因为没这个语法),只是提醒不可以删除.

查询一下锁的情况:
select username,v$lock.sid,v$lock.TYPE,

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 = 'SYS';


           USERNAME        SID        TYPE        RBS        SLOT        SEQ        LMODE        REQUEST

1        SYS                  159        TM        0        53133        0        3        0

2        SYS                  159        TX        10        39        450        6        0

 

TM锁住的对象是53133(v$lockid1含义为objet_id), 然后到dba_objects中查出该对象确实为u1.t1.

 

TM锁是跟对象有关的.DML修改数据的时候,一定要先获得对象上的TM锁之后,再获得事务TX(事实上相当于行锁),然后才能对锁定的行进行修改. 如果一个事务涉及到多个对象,TM锁会获得多个,TX锁在一个事务中总是一把.
 

再做个一个事务在多个表中dml操作的试验:

Session1:
Create table u1.t2 as select * from u1.t1;

Insert into u1.t1(Id) values(4);
Insert into u1.t2(id) values(4);
 

查询锁的情况,可以看到2TM锁住两个对象,但始终一个TX(但也锁住了所有的修改的行).
           USERNAME        SID        TYPE        RBS        SLOT        SEQ        LMODE        REQUEST

1        SYS                  159        TM        0        53133        0        3        0

2        SYS                  159        TM        0        53219        0        3        0

3        SYS                  159        TX        8        6        497        6        0

 

其他:

1)TM锁受参数DML_LOCKS控制,但是一个特例就是如果DML_LOCKS=0,那么并不是TM锁无法获得,而是ddl锁不允许.--某些特殊作用
2)也可以单独对一个对象禁止使用锁.ALTER TABLE xxx disable table lock;-->保护该表不被异常删除了..

SQL> alter table u1.t1 disable table lock;
SQL> drop table u1.t1;

drop table u1.t1

            *

ERROR at line 1:

ORA-00069: cannot acquire lock -- table locks disabled for T1

SQL> insert into u1.t1(id) values(1);

1 row created.

此时去查锁,只有tx,没有tm.