Oracle锁3:DDL锁

本文详细介绍了Oracle数据库中的DDL锁,包括排它DDL锁和共享DDL锁的作用及使用场景,以及解析锁的特性。重点阐述了如何保护schema对象在DDL操作期间不受干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当一个正在进行的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域存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值