DDL锁分为三种
1.排他DDL锁
2.共享DDL锁
3.可中断解析锁
大部分DDL都带有排他DDL锁,如一个表被修改中,可以使用select查询数据,但是大多数操作都是不允许执行的,包括所有其他DDL语句。
但是在oracle中,有一些DDL操作没有DDL锁也发生。比如online创建索引
在线创建索引,会带有DL,OD,低级TM锁,但是没有排他DDL锁
DL 直接加载锁,对表进行直接加载路径与创建索引不能同时进行。
OD锁 online DDL支持真正的联机。
低级TM锁 防止其他DDL发生,同时还允许DML正常进行
另一类是共享DDL锁
创建过程或视图时,会对其中涉及到的表添加共享DDL锁,这样可以修改表的内容但是不能修改表的结构。
可中断解析锁
会话解析一条语句时,对于该语句引用的每一个对象都会施加解析锁,这个目的是如果以某种方式删除或修改了引用对象,可以将共享池中已经解析的缓存语句无效刷出。
查询指定表的锁情况
select
(select username from v$session where sid=v$lock.sid) username,
sid,
id1,
id2,
lmode,
request,block,v$lock.type
from v$lock
where id1=73834;//object_id 通过user_objects查询
查询当前会话的可中断解析锁,作用是发现代码无法编译或超时等待可以通过这个查询找到谁正在使用
set linesize 1000
select session_id sid,owner,name,type,mode_held held,mode_requested request
from dba_ddl_locks
where session_id = (select sid from v$mystat where rownum=1);