`
liwenshui322
  • 浏览: 519008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE DDL锁介绍

阅读更多

      在DDL操作中会自动为对象加DDL锁(DDL Lock),从而保护这些对象不会被其他会话所修改。例如,如果我执行一个DDL操作ALTERTABLE T,表T上就会加一个排他DDL锁,以防止其他会话得到这个表的DDL锁和TM锁。在DDL语句执行期间会一直持有DDL锁,一旦操作执行就立即释放DDL锁。实际上,通常会把DDL语句包装在隐式提交(或提交/回滚对)中来执行这些工作。由于这个原因,在Oracle中DDL一定会提交。

      因此,DDL总会提交(即使提交不成功也会如此)。DDL一开始就提交,一定要知道这一点。它首先提交,因此如果必须回滚,它不会回滚你的事务。如果你执行了DDL,它会使你所执行的所有未执行的工作成为永久性的,即使DDL不成功也会如此。如果你需要执行DDL,但是不想让它提交你现有的事务,就可以使用一个自治事务换言之,在执行DDL语句之后,会立即提交事务。这样的话,在执行DDL语句之前,如果执行了DML语句,也会被一并提交,并且不可回滚。

     有3种类型的DDL锁:

     1.排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这说明,在DDL操作期间你可以查询一个表,但是无法以任何方式修改这个表。

     2.共享DDL锁(Share DDL lock):这些锁会保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。

     3.可中断解析锁(Breakable parse locks):这些锁允许一个对象(如共享池中缓存的一个查询计划)向另外某个对象注册其依赖性。如果在被依赖的对象上执行DDL,Oracle会查看已经对该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些锁是“可中断的”,它们不能防止DDL出现。

 

     大多数DDL都带有一个排他DDL锁。比如发出如下一条语句:Alter table t add new_column date。

      但是,现在有些DDL操作没有DDL锁也可以发生。例如,可以发出以下语句:create index t_idx on t(x) ONLINE;

      ONLINE关键字会改变具体建立索引的方法。Oracle并不是加一个排他DDL锁来防止数据修改,而只会试图得到表上的一个低级(mode 2)TM锁。这会有效地防止其他DDL发生,同时还允许DML正常进行。Oracle执行这一“壮举”的做法是,为DDL语句执行期间对表所做的修改维护一个记录,执行CREATE时再把这些修改应用至新的索引。这样能大大增加数据的可用性。

      另外一类DDL会获得共享DDL锁。在创建存储的编译对象(如过程和视图)时,会对依赖的对象加这种共享DDL锁。例如,如果执行以下语句:

      Create view MyView
      as
      select *
      from emp, dept
      where emp.deptno = dept.deptno;

      表EMP和DEPT上都会加共享DDL锁,而CREATE VIEW命令仍在处理。可以修改这些表的内容,但是不能修改它们的结构。

      最后一类DDL锁是可中断解析锁。你的会话解析一条语句时,对于该语句引用的每一个对象都会加一个解析锁。加这些锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效(刷新输出)。

      有一个意义非凡的视图可用于查看这个信息,即DBA_DDL_LOCKS视图。对此没有相应的V$视图。DBA_DDL_LOCKS视图建立在更神秘的X$表基础上,而且默认情况下,你的数据库上不会安装这个视图。可以运行[ORACLE_HOME]/rdbms/admin目录下的catblock.sql脚本来安装这个视图以及其他锁视图。必须作为用户SYS来执行这个脚本才能成功。一旦执行了这个脚本,可以对视图运行一个查询。查询语句如下:

    select session_id sid, owner, name, type,mode_held held, mode_requested request from dba_ddl_locks



 

 

     这个视图对开发人员很有用,发现测试或开发系统中某段代码无法编译时,将会挂起并最终超时。这说明,有人正在使用这段代码(实际上在运行这段代码),你可以使用这个视图来查看这个人是谁。对于GRANTS和对象的其他类型的DDL也是一样。例如,无法对正在运行的过程授予EXECUTE权限。可以使用同样的方法来发现潜在的阻塞者和等待者。

 

 

分享到:
评论

相关推荐

    Oracle数据库的锁类型

    Oracle数据库的锁类型大致可以分为三类:DML锁、DDL锁和内部锁与闩锁。DML锁(数据锁)主要用于保护数据的完整性,DDL锁(字典锁)用于保护数据库对象的结构,如表、索引等,而内部锁和闩锁则用于保护数据库的内部...

    oracle数据库锁使用

    字典锁主要用于内部管理,特别是语法分析和DDL操作,用户无法直接控制。而数据锁则是我们关注的重点,它们涉及到实际的数据操作,包括对数据的读取和修改。 1. 共享锁(S锁):共享锁允许事务进行读操作,但不允许...

    Oracle的锁机制

    根据保护的对象,Oracle的锁分为内部锁、闩、DDL锁和DML锁。内部锁和闩是系统内部管理的,用于保护数据库的内部结构。DDL锁保护数据库对象的结构,如表和索引的定义,自动在执行SQL定义语句时添加。DML锁则直接作用...

    Oracle的锁内幕解惑

    本文旨在深入探讨Oracle锁机制的内部原理,特别是针对DML锁、DDL锁以及Latch等锁机制进行详细解析,帮助DBA更好地理解和应对实际工作中遇到的各种锁问题。 #### 二、Oracle锁机制概览 Oracle的锁机制可以大致分为...

    对于Oracle锁的一些理论总结

    在Oracle中,锁分为三类:DML锁(用于保护数据完整性)、DDL锁(保护数据库对象结构)以及内部锁和Latch(保护数据库内部结构)。DML锁是本文的重点,它包括行级锁(row level lock)和表级锁(table level lock)。...

    oracle存储过程解锁

    ### 描述:“如果存储过程被锁住,可以使用这个存储过程解锁方法” #### 解析: 当遇到存储过程被锁定的情况时,通常可以通过查询`dba_ddl_locks`视图来查找锁定的详细信息。例如,要检查名为`prc_exec_day`的存储...

    ORACLE数据库锁表问题浅析.pdf

    6.DDL语句时是6的锁 锁机制的应用场景: 1.长时间不释放的锁 2.解决锁表问题 锁机制的优点: 1.保证数据的一致性和正确性 2.避免数据的不一致和错误 3.提高数据库应用的性能 锁机制的缺点: 1.可能会导致长...

    Oracle 锁机制问题详解

    本文将详细介绍 Oracle 中的锁机制原理及其解锁方法。 #### 二、锁机制的重要性 在任何多用户数据库应用中,最终都会出现两个或更多用户希望同时处理相同记录的情况。这种情况在逻辑上是不可能的,并且数据库必须...

    oracle锁表及解锁

    表级锁通常用于DML操作或DDL操作,而行级锁则是在执行更新、插入或删除等操作时自动产生的。 #### 检查锁定情况 要检查Oracle数据库中的锁状态,可以使用以下查询语句: ```sql SELECT /*+RULE*/ s.username, ...

    Oracle数据库锁的研究.pdf

    包括排他DDL锁、共享DDL锁和可中断解析锁,主要用于DDL操作。 2. 按照锁的粒度划分,主要有行级锁和表级锁: - 行级锁:锁定单个数据行,只允许事务修改锁定的行,其他用户可以访问未锁定的行。在事务进行DML操作...

    浅谈ORACLE数据库锁的类型与机制.pdf

    Oracle 数据库锁可以分为五大类:DML 锁、DDL 锁、内部锁、分布式锁和 PCM 锁。 1. DML 锁(Data Locks):用于保护数据的完整性,防止多个用户同时访问同一数据块。 DML 锁可以分为两种: fixed lock 和 ...

    ORACLE锁深入分析

    进一步细分,Oracle的锁可以分为DML锁、DDL锁和内部锁与闩。DML锁用于保护数据的完整性,包括TM锁(表级锁)和TX锁(事务锁或行级锁)。TM锁在执行DML语句时自动申请,对整个表进行锁定,分为SS、SX、S、X四种模式。...

    oracle数据库中的锁机制

    例如,在执行大型批量操作或在表上执行DDL(数据定义语言)操作时,可能会使用表级锁。这可以防止其他事务对表进行任何修改。 3. **模式对象锁**:除了数据行和表之外,Oracle还提供对数据库模式对象(如视图和索引...

    oracle由于对象被锁住无法编译处理

    1. **查询DDL锁**:通过`DBA_DDL_LOCKS`视图,可以查看当前所有被DDL操作(如CREATE, ALTER等)锁定的对象。 ```sql SELECT * FROM DBA_DDL_LOCKS WHERE NAME = UPPER('DIC'); ``` 2. **查找锁定会话**:利用`V$...

    oracle锁讲解笔记

    Oracle中的锁主要分为三类:DML锁、DDL锁和内部锁(LATCH)。DML锁又细分为表级锁(TM)和行级锁(TX)。 - **表级锁(TM)**:用于保护表级别的操作,防止DDL语句的执行。 - **行级锁(TX)**:用于保护行级别的...

    oracle全套ppt教程

    3-oracle之DDL和DML.ppt 6、oracle之数据库对象.PPT 8、oracle之安全.ppt 10、oracle之PLSQL基础.PPT 11、oracle之PLSQL高级.PPT 12、oracle之查询优化.PPT 12、数据库的规范化设计.PPT oracle管理之表空间和数据...

    Oracle 10g锁机制

    2. DDL级锁:这涉及到对数据库结构的操作,如创建(Create)、修改(Alter)和删除(Drop)表、索引等,这些操作需要特定的锁来确保数据定义的一致性。 3. DML级锁:涉及数据操纵语言(DML)操作,如INSERT、UPDATE...

    数据库锁学习文档

    在Oracle数据库中,锁进一步细分为DML锁(数据锁)和DDL锁(字典锁)。DML锁用于确保数据完整性,而DDL锁则用于保护数据库对象的结构。此外,还有内部锁,主要用于数据库内部结构的保护,例如Latch,这是一种轻量级...

Global site tag (gtag.js) - Google Analytics