WEB开发网
开发学院数据库Oracle Oracle中的DDL锁 阅读

Oracle中的DDL锁

 2010-10-01 12:59:08 来源:WEB开发网   
核心提示: 我们来做个试验,并从dba_ddl_locks视图里查看有关DDL锁定的情况,Oracle中的DDL锁(3),在该试验中,我们创建一个存储过程,因此也需要在p_test上添加排他的DDL锁定,但是这时p_test上已经存在DDL锁定了,如下所示:SQL> create or replace

我们来做个试验,并从dba_ddl_locks视图里查看有关DDL锁定的情况。在该试验中,我们创建一个存储过程,如下所示:

SQL> create or replace procedure p_test is
  2 ln_id number;
  3 begin
  4 dbms_lock.sleep(600);
  5 end;
  6 /

在该存储过程中,我们调用dbms_lock.sleep,dbms_lock.sleep能够让系统挂起,挂起的时间长度由传入参数决定,传入参数的单位是秒。在本例中,也就是让系统挂起600秒。

然后,我们启动三个session,并检索每个session的SID号,如下所示:

  SQL> select sid from v$mystat where rownum=1;
  SID
  ----------
  149
  SQL> select sid from v$mystat where rownum=1;
  SID
  ----------
  151
  SQL> select sid from v$mystat where rownum=1;
  SID
  ----------
  159

在149号session里我们执行存储过程p_test:

SQL> exec p_test;

这时149号session被挂起,挂起持续的时间为600秒。然后我们到151号session里执行下面的SQL语句,对p_test进行编译:

SQL> alter procedure p_test compile;

我们会发现151号session也被挂起了,因为这时149号session正在执行p_test,因此151号的编译p_test命令必须等待。

接下来,我们到159号session里执行下面的语句,删除p_test:

SQL> drop procedure p_test;

显然,由于151号session正在编译p_test,我们也无法删除p_test,因此159号session也被挂起了。

我们查询dba_ddl_locks视图,来了解这时DDL锁定的情况:

 SQL> select session_id,type,mode_held,mode_requested from dba_ddl_locks
  2 where session_id in(149,151,159) and wner='HR' and name='P_TEST';
  SESSION_ID TYPE MODE_HELD MODE_REQUESTED
  ---------- --------------------- --------- --------------
  159 Table/Procedure/Type Null None
  159 Table/Procedure/Type None Exclusive
  151 Table/Procedure/Type Exclusive None
  149 Table/Procedure/Type Null None

从MODE_HELD列上可以看到,151号session尝试编译p_test,因此它获得了p_test上的排他的DDL锁定。而从MODE_REQUESTED列上可以看到,159号session尝试删除p_test,因此也需要在p_test上添加排他的DDL锁定。但是这时p_test上已经存在DDL锁定了,于是159号session只好等待。

上一页  1 2 3 

Tags:Oracle DDL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接