`
liwenshui322
  • 浏览: 512043 次
  • 性别: 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锁深入分析

    DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护 数据库的内部结构。 在Oracle数据库中,DML锁主要包括TM锁和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 从入门到精通视频教程(11G版本)(ppt)

    第14章-常用工具介绍 什么是SQL*Plus 使用SQL*Plus 使用PL/SQL Developer 第15章-控制文件和日志文件 控制文件与日志文件 初识控制文件 控制文件的多路复用 创建控制文件 日志文件的管理 第16章-表空间的管理...

    oracle Session与lock 解除

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改 4:Share 共享锁(S):阻止其他DML操作 5:S/Row-X 共享行专用(SRX):阻止其他...

    ORACLE9i_优化设计与系统调整

    第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE用户是学习ORACLE数据库中的基础知识,下面就介绍下类系统常用的默认ORACLE用户: 1. sys用户:超级用户,完全是个SYSDBA(管理数据库的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,...

    oracle11g

    第十章:Oracle的事务和锁 第十一章:索引 第十二章:约束 第十三章:视图 第十四章:同义词 第十五章:序列 第三部分:SQL语言的扩展 第十六章:INSERT语句总结 第十七章:DML和DDL语句的其他用法 第十八...

    oracle管理应用工具和sql高级应用视频教程详细完整版

    第三章:Oracle的事务和锁 第四章:使用索引 第五章:约束的作用 第六章:视图、同义词和序列 第七章:Insert语句语法 第八章:DML和DDL语句 第九章:Select的高级应用 第十章:Oracle的国际化支持。 由于文件过大,...

    Oracle命令行运维工具oclient

    Oclient V2.0在Oclient V1.0基础上主要增加了多表传输,多表同步,新增支持DDL同步;同时修增加异常锁,大事务,会话详情等实用功能,方便运维人员定位问题。常用功能输入错误时增加了友好提示。最后修改了许多BUG...

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    8.5.2 并行ddl操作 195 8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接...

    Oracle Apex Database Monitor:Oracle Apex 数据库监视器-开源

    数据库监控功能: - 实例 - SGA - PGA - 数据库参数 - 缓冲池保留候选 - 版本和补丁实时监控 - 锁 - DDL 锁 - DML 锁 - 库缓存锁 - 等待库缓存 Pin - 会话浏览器 - SQL 语句 - 临时使用- 绑定变量 - SQL 统计 - 段...

    oracle学习经典教程

    1.4.1.2.3 按操作划分,可分为DML 锁(data locks,数据锁)、DDL 锁 (data dictionary lock) 和System Locks。.........84 1.4.1.2.4 DML 锁..........84 1.4.1.2.5 DDL 锁(dictionary locks).........

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    6.3.2 DDL锁 215 6.3.3 闩 218 6.3.4 手动锁定和用户定义锁 226 6.4 小结 227 第7章 并发与多版本 229 7.1 什么是并发控制? 229 7.2 事务隔离级别 230 7.2.1 READ UNCOMMITTED 232 7.2.2 READ COMMITTED ...

    jf_Oracle_经典笔记.docx

    4. 利用dbms_metadata.get_ddl查看DDL语句 6 5. 数据库备份和恢复 9 6. user_objects 表 9 7. DBLink的使用 10 8. 查看表是否被截断过 13 9. ORA-01654 索引无法通过128(在表空间中XXX)扩张 14 10. SID和...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    8.4.1 共享锁与排他锁 287 8.4.2 排队机制 287 8.4.3 锁定争用 288 8.4.4 死锁 290 8.5 撤销概述 291 8.6 事务与撤销数据 292 8.7 管理撤销 293 8.7.1 与撤销相关的错误条件 294 8.7.2 用于撤销管理与保留...

    精通Oracle.10g.PLSQL编程

    使用Oracle系统包 17.1 DBMS_OUTPUT 17.2 DBMS JOB 17.3 DBMS PIPE 17.4 DBMSAIERT 17.5 DBMS TRANSACTION 17.6 DBMS SESSION 17.7 DBMS ROWID 17.8 DBMSRLS 17.9 DBMS DDL ...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    8.5.2 并行ddl操作 195 8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接...

    如何设计oracle10g全文检索

    如何设计oracle10g全文检索 /****************************************** * 前提及说明: * 1).portal为应用用户 * 2).当前数据库中必须有CTXSYS用户和CTXAPP角色 * 2008/10/17 yanjianzhong ************...

Global site tag (gtag.js) - Google Analytics