DDL锁
ddl操作一个对象期间自动获得,防止ddl期间其他会话操作该对象.ddl分类
a)Exclusive ddl lock:排他ddl锁,上面介绍过的. 防止其他ddl 锁以及TM锁的获得.--其他session只能查询了最常见的了.alter session enable resumable;alter table u1.t1 allocate extent(size 60m) USERNAME SID TYPE RBS SLOT SEQ LMODE REQUEST
1 SYS 159 TT 0 4 0 4 0
2 SYS 159 TT 0 4 16 4 0
3 SYS 159 TT 0 4 16 4 0
4 SYS 159 TT 0 4 16 4 0
5 SYS 159 TT 0 4 16 4 0
6 SYS 159 TM 0 53133 0 6 0
7 SYS 159 TX 2 16 504 6 06和7是TM和TX锁,而且都是6(exclusive).大量insert操作的时候 USERNAME SID TYPE ID1 ID2 RBS SLOT SEQ LMODE REQUEST
1 SYS 158 HW 7 29360161 0 7 29360161 6 0
2 SYS 158 TM 53221 0 0 53221 0 3 0
3 SYS 158 TX 524322 499 8 34 499 6 0Drop column的时候 --->TM和TX锁(TM的ID1中自然是object_Id =53222). USERNAME SID TYPE ID1 ID2 RBS SLOT SEQ LMODE REQUEST
1 SYS 158 TM 53222 0 0 53222 0 5 0
2 SYS 158 TX 131082 505 2 10 505 6 0并不是所有的DDL锁都是排他的,比如上面看到的例子中5还有下面的例子:Create index xxx on xxx(xxx) online;这句只取得低级别的TM锁(mode 2),这样可以保证在创建的过程中对象不被破坏,而且还可以修改对象的内容(在线创建索引).
b,Share ddl 锁:保护引用对象的结构不被修改,但允许引用对象修改内容(即,对于这类操作过程中引用了的对象,对象内记录可以修改,但不能修改结构)当创建程序包或者试图时,比如create view v1 as select * from emp,dept where emp.deptno=dept.deptno在试图创建的过程中,emp和dept表结构上不能被修改,但其内容可以改.
c,Breakable parse lock:当会话parse一个sql语句的时候,一个parse lock会被获得,其会跟踪每个其引用的对象.因为解析过的语句会被cache住,而如果该语句中的引用对象被修改过,谁来通知cache中的sql语句invalid(flush)呢?就是这个机制.有一个试图来看这类锁. Dba_ddl_locks,默认无该试图,需要运行@$ORACLE_HOME/rdbms/admin/catblock.sql从中可以查到所有的当前会话正在锁定的对象.这个很容易试验,建立一个空procedure,然后到试图中查询出来.再compile该对象.然后再查-已经没了.