LOCK(2)-TM LOCK
来源:互联网 发布:删除表里数据 sql语句 编辑:程序博客网 时间:2024/04/29 23:26
- TM(DML Enqueue)锁
- 修改内容的时候,结构是不应该被修改的.这是通过TM锁实现的.
Session1: delete u1.t1;
Session2: drop u1.t1
drop table u1.t1
- 修改内容的时候,结构是不应该被修改的.这是通过TM锁实现的.
*
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$lock中id1含义为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);
查询锁的情况,可以看到2个TM锁住两个对象,但始终一个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锁.
- LOCK(2)-TM LOCK
- TM lock(对象锁)
- LOCK
- LOCK
- lock
- lock
- Lock
- Lock()
- lock
- LOCK
- Lock
- Lock
- Lock
- lock
- lock
- Lock
- Lock
- Lock
- 网站建设中的概念性问题
- Java异常总结
- java对时间的各种操作方法
- [2008-07-20 16:17]gcc和g++的区别与联系
- SQL优化34条
- LOCK(2)-TM LOCK
- [2008-07-24 18:09]贪心(POJ 2253)
- Tiles简介
- datatable和list互换
- [2008-07-26 17:36]输入、输出
- struts原理及组件
- [2008-04-09 10:22]visual studio 2005下命令行编译、连接生成dll
- 一个Java程序员应该掌握的10项技能
- 学习Jakarta Struts 1.1 (一)