oracle锁和闩_笔记12:OD锁
OD锁是Oracle Database 11g中新增的一种锁类型(10g和9i中看不到这种锁),它支持真正的联机DDL。过去(10g以及之前),诸如CREATE INDEX ONLINE的联机DDL并不是100%的联机。它要在CREATE语句开始和结束时用一个锁,以防止其他并发活动(对基表数据的修改)。这只是“大部分联机”,而不是“安全联机”。从11g开始,CREATE INDEX ONLINE命令是完全联机的,在命令的开始/结束处不再需要排他锁。实现这一“创举”的部分原因就是引入了OD(联机DDL,Online DDL)锁,它在内部使用,支持真正的联机DDL操作。
共享DDL锁。在创建存储的编译对象(如过程和视图)时,会对依赖的对象加这种共享DDL锁。例如,如果执行以下语句:
Create view MyView
as
select emp.empno,emp.ename,dept.deptno,dept.dname
from emp,dept
where emp.deptno=dept.deptno;
表EMP和DEPT上都会加共享DDL锁,而CREATE VIEW命令仍在处理。可以修改这些表的内容,但是不能修改它们的结构。
可中断解析锁。你的会话解析一条语句时,对于该语句引用的每一个对象都会加一个解析锁。加这些锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效(刷新输出)。
有一个意义非凡的视图可用于查看这个信息,即DBA_DDL_LOCKS视图。对此没有相应的V$视图。DBA_DDL_LOCKS视图建立在更神秘的X$表基础上,而且默认情况下,你的数据库上不会安装这个视图。可以运行[ORACLE_HOME]/rdbms/admin目录下的catblock.sql脚本来安装这个视图以及其他锁视图。必须作为用户SYS来执行这个脚本才能成功。一旦执行了这个脚本,可以对视图运行一个查询。
SQL> connect / as sysdba
Connected.
SQL> set linesize 1000
SQL> select session_id sid,owner,name,type,mode_held held,mode_requested request
2 from dba_ddl_locks
3 where session_id=(select sid from v$mystat where rownum=1)
4 /
SID OWNER NAME
TYPE
HELD
REQUEST
---------- ----------------------------------------------------------------------------
---------------------------------------------------------------------------------------
----------------- ---------------------------------------------------------------------
---------------------------------------------------------------------------------------
------------------------ --------------------------------------------------------------
---------------------------------------------------------- ---------------------------
---------------------------
8 SYS DATABASE
18
Null
None
要看到一个实际的可中断解析锁,下面先创建并运行存储过程P:
SQL> create or replace procedure p
2 as
3 begin
4 null;
5 end;
6 /
Procedure created.
SQL> exec p
PL/SQL procedure successfully completed.
过程P会出现在DBA_DDL_LOCKS视图中。我们有这个过程的一个解析锁:
SQL> select session_id sid,owner,name,type,
2 mode_held held,mode_requested request
3 from dba_ddl_locks
4 where session_id=(select sid from v$mystat where rownum=1)
5 /
SID OWNER
NAME
TYPE
HELD
REQUEST
---------- ----------------------------------------------------------------------------
---------------------------------------------------------------------------------------
----------------- ---------------------------------------------------------------------
---------------------------------------------------------------------------------------
------------------------ --------------------------------------------------------------
---------------------------------------------------------- ---------------------------
---------------------------
8 SYS
Table/Procedure/Type
Null None
8 SYS
DATABASE
18
Null None
然后重新编译这个过程,并再次查询视图
SQL> alter procedure p compile;
Procedure altered.
SQL> select session_id sid,owner,name,type,
2 mode_held held,mode_requested request
3 from dba_ddl_locks
4 where session_id=(select sid from v$mystat where rownum=1)
5 /
SID OWNER
NAME
TYPE
HELD
REQUEST
---------- ----------------------------------------------------------------------------
---------------------------------------------------------------------------------------
----------------- ---------------------------------------------------------------------
---------------------------------------------------------------------------------------
------------------------ --------------------------------------------------------------
---------------------------------------------------------- ---------------------------
---------------------------
8 SYS
DATABASE
18
Null
None
可以看到,现在这个视图中没有P了。我们的解析锁中断了。这个视图对开发人员很有用,发现测试或开发系统中某段代码无法编译时,将会挂起并最终超时。这说明,有人正在使用这段代码(实际上在运行这段代码),可以使用这个视图来查看这个人是谁。对于GRANTS和对象的其他类型的DDL也是一样。例如,无法对正在运行的过程授予EXECUTE权限。可以使用同样的方法来发现潜在的阻塞者和等待者。
http://www.52ij.com/jishu/5203.htmloracle锁和闩_笔记11:DDL锁
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5204.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
