oracle锁和闩_笔记11:DDL锁
2DDL锁
在DDL操作中会自动为对象加DDL锁(DDL Lock),从而保护这些对象不会被其他会话所修改。
在DDL语句执行期间会一直持有DDL锁,一旦操作执行完毕就立即释放DDL锁。实际上,通常会把DDL语句包装在隐式提交(或提交/回滚对)中来执行这些工作。由于这个原因,在Oracle中DDL一定会提交。每条CREATE、ALTER等语句实际上都如下执行(这里用伪代码来展示):
Begin
Commit;
DDL-STATEMENT
Commit;
Exception
When others then rollback;
End;
因此,DDL总会提交(即使DDL语句执行不成功也会如此)。DDL一开始就提交,一定要知道这一点。它首先提交,因此如果必须回滚,它不会回滚你的事务。如果执行了DDL,它会使你所有未完成的工作成为永久性的,即使DDL不成功也会如此。如果需要执行DDL,但是不想让它提交现有的事务,就可以使用一个自治事务(autonomous transaction)。
有以下3种类型的DDL锁。
.排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这说明,在DDL操作期间可以查询一个表,但是无法以任何方式修改这个表。
.共享DDL锁(Share DDL lock):这些锁会保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。
.可中断解析锁(Breakable parse locks):这些锁允许一个对象(如共享池中缓存的一个查询计划)向另外某个对象注册其依赖性。如果在被依赖的对象上执行DDL,Oracle会查看已经对该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些锁是“可中断的”,它们不能防止DDL出现。
大多数DDL都带一个排他DDL锁。如果发出如下一条语句:
Alter table t move;
在执行这条语句时,表T不能被别人修改。在此期间,可以使用SELECT查询这个表,但是大多数其他操作都不允许执行,包括所有其他DDL语句。在Oracle中,现在有些DDL操作没有DDL锁也可以发生。
例如,可以发出以下语句:
create index t_idx on t(x) ONLINE;
ONLINE关键字会改变具体建立索引的方法。Oracle并不是加一个排他DDL锁来防止数据修改,而只会试图得到表上的一个低级(mode 2)TM锁。这会有效地防止其他DDL发生,同时还允许DML正常进行。Oracle执行这一“壮举”的做法是,为DDL语句执行期间对表所做的修改维护一个记录,执行CREATE时再把这些修改应用至新的索引。这样能大大增加数据的可用性。
创建一个表来看看这个情况:
SQL> create table t as select * from all_objects
Table created.
SQL> select object_id from user_objects where object_name='T';
OBJECT_ID
----------
166272
SQL> create index t_idx on t(owner,object_type,object_name) ONLINE;
Index created.
同时在另一个会话中运行这个查询来查看这个新创建的表所加的锁。
???怎么查询结果为0,而不是书上的4个锁
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 id1=166272;
no rows selected
http://www.52ij.com/jishu/5202.htmloracle锁和闩_笔记10:TM(DML Enqueue)锁
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5203.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
