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

Oracle中的DDL锁

 2010-10-01 12:59:08 来源:WEB开发网   
核心提示:当我们发出DDL命令时,会自动在被处理的对象上添加DDL锁定,Oracle中的DDL锁,从而防止对象被其他用户所修改,当DDL命令结束以后,接下来,我们在sess #1里执行下面的语句:SQL> create table t(c1 number);create table t(c1 number)*ERROR a

当我们发出DDL命令时,会自动在被处理的对象上添加DDL锁定,从而防止对象被其他用户所修改。当DDL命令结束以后,则释放DDL锁定。我们不能显式地请求一个DDL锁定,只有当对象结构被修改或者被引用时,才会在对象上添加DDL锁定。比如创建或者编译存储过程时会对引用的对象添加DDL锁定。在创建视图时,也会对引用的表添加DDL锁定等。

在执行DDL命令之前,Oracle会自动添加一个隐式提交命令,然后执行具体的DDL命令,在DDL命令执行结束之后,还会自动添加一个隐式提交命令。实际上,Oracle在执行DDL命令时,都会将其转换为对数据字典表的DML操作。比如我们发出创建表的DDL命令时,Oracle会将表的名称插入数据字典表tab$里,同时将表里的列名以及列的类型插入col$表里等。因此,在DDL命令中需要添加隐式的提交命令,从而提交那些对数据字典表的DML操作。即使DDL命令失败,它也会发出提交命令。

我们来看下面的例子,启动两个session,其中一个叫做sess #1,另一个叫做sess #2。在sess #1里发出如下的SQL语句:

SQL> insert into t values(1);

1 row created.

然后在sess #2里查询表T里的数据:

SQL> select * from t;

no rows selected

显然,由于sess #1还没有提交,因此sess #2里不能检索出sess #1所插入的记录。接下来,我们在sess #1里执行下面的语句:

 SQL> create table t(c1 number);
  create table t(c1 number)
  *
  ERROR at line 1:
  ORA-00955: name is already used by an existing object

由于表T已经存在,因此创建表T的命令失败。这时我们再回到sess #2里查询表T:

1 2 3  下一页

Tags:Oracle DDL

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