oracle锁和闩_笔记10:TM(DML Enqueue)锁
TM(DML Enqueue)锁
TM锁(TM lock)用于确保在修改表的内容时,表的结构不会改变。例如,如果已经更新了一个表,会得到这个表的一个TM锁。这会防止另一个用户在该表上执行DROP或ALTER命令。如果有表的一个TM锁,而另一位用户试图在这个表上执行DDL,就会得到ORA-00054:resource busy and acquire with NOWAIT specified
以下显示了这些锁在V$LOCK表中什么样子:
SQL> create table t1(x int);
Table created.
SQL> create table t2(x int);
Table created.
SQL> connect / as sysdba
Connected.
SQL> insert into t1 values(1);
1 row created.
SQL> insert into t2 values(1);
1 row created.
SQL> select (select username
2 from v$session
3 where sid=v$lock.sid) username,
4 sid,
5 id1,
6 id2,
7 lmode,
8 request,block,v$lock.type
9 from v$lock
10 where sid=(select sid
11 from v$mystat
12 where rownum=1)
13 /
USERNAME
---------------------------------------------------------------------
-----------
SID ID1 ID2 LMODE REQUEST BLOCK TYPE
---------- ---------- ---------- ---------- ---------- ---------- ---
---
SYS
2272 100 0 4 0 2 AE
SYS
2272 166107 0 3 0 2 TM
SYS
2272 166108 0 3 0 2 TM
USERNAME
---------------------------------------------------------------------
-----------
SID ID1 ID2 LMODE REQUEST BLOCK TYPE
---------- ---------- ---------- ---------- ---------- ---------- ---
---
SYS
2272 2031616 22 6 0 2 TX
SQL> l
1 select object_name,object_id
2 from user_objects
3* where object_id in (166107,166108)
SQL> /
OBJECT_NAME
---------------------------------------------------------------------
-----------
OBJECT_ID
----------
T1
166107
T2
166108
尽管每个事务只能得到一个TX锁,但是TM锁则不同,修改了多少个对象,就能得到多少个TM锁。在此,有意思的是,TM锁的ID1列就是DML锁定对象的对象ID,所以,很容易发现哪个对象持有这个锁。
关于TM锁还有另外一个有意思的地方:系统中允许的TM锁总数可以由你来配置。实际上,这个数可能设置为0。但这并不是说你的数据库变成了一个只读数据库(没有锁),而是说不允许DDL。在非常专业的应用(如RAC实现)中,这一点就很有用,可以减少实例内可能发生的协调次数。通过使用ALTER TABLE TABLENAME DISABLE TABLE LOCK命令,还可以逐对象地禁用TM锁。这是一种快捷方法,可以使意外删除表的“难度更大”,因为在删除表之前,必须重新启用表锁。还能用它来检测由于外键未加索引而导致的全表锁。
http://www.52ij.com/jishu/5201.htmloracle数据库:锁和闩_笔记9
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5202.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
