当一个正在进行的DDL操作执行在或者引用了schema对象(注)时,Data dcictionary(DDL)锁用于保护该schema对象的定义,在DDL操作执行期间仅锁定单个schema对象,数据库从不锁定整个数据字典。
Oracle数据库自动地请求DDL锁,用户不能显示请求DDL锁。例如,如果用户创建一个存储过程,那么数据库自动为存储过程中引用的对象请求DDL锁,这些DDL锁防止存储过程被编译完成前这个对象被改变或者删除。
排它DDL锁
一个排它DDL锁阻止其它session获取DDL或DML锁。大部分DDL操作,除了在“共享DDL锁”中描述的,都会为资源要求排它DDL锁,例如:当ALTER TABLE正在为表格增加一列时,DROP TABLE不允许被执行,反之亦然。
排它DDL锁持续直到DDL操作执行完成并自动提交,在这期间,如果其它操作需要使用该schema对象,则需要等待直到老的DDL锁被释放。
共享DDL锁
共享DDL锁防止会破坏结构的冲突的DDL操作,但是允许类似的DDL操作并行执行。
例如,当一个CREATE PROCEDURE被执行时,事务会为所有的引用表要求共享DDL锁,其它事务能并行地创建引用相同表的存储过程并在相同的表上请求共享DDL锁,但是没有事务能请求一个排它DDL锁在任何被引用的表上。
共享DDL锁持续直到DDL操作执行完成并自动提交,因此,获取一个共享DDL锁的事务被保证事务执行期间schema对象保持不变。
可中断解析锁
SQL语句和PL/SQL块中引用的每个schema对象都会使用一个解析锁,因为如果一个引用对象被改变或者删除,对应的共享SQL域(注)将失效。一个解析锁被叫做可中断解析锁(breakable parse lock),因为它不阻止任何DDL操作并且为了允许冲突的DDL操作能被中断。
一个解析锁在解析SQL语句时被要求,如果语句的共享SQL域被保留在共享池中,锁将被一直持有。
注:
schema是数据库对象的名字集合;
schema对象是在一个schema中存储的数据的逻辑结构;
共享SQL域(shared SQL area)指在共享池(shared pool)中为一个SQL语句保存的解析树(parse tree)和执行计划,一个语句只有一个共享SQL域存在。