Oracle:DDL和事务回滚

22

Oracle DDL(创建/更改)是否可以像MS SQL(从2005年开始)那样具有事务性?


3个回答

25

在Oracle中,DDL不是事务性的。从11.2文档中可知:

在每个DDL语句之前和之后,Oracle数据库都会隐式提交当前事务。


21

在Oracle中,DDL语句本身并不是事务性的,或者说,在每个DDL语句执行之前和之后,都会包含一个隐式提交。

任何作为该语句一部分的数据修改都将在该事务内完成。例如,某些alter table语句可能会触发表上的触发器,进而可以执行其他DML操作。所有这些操作都将在嵌套DDL语句的事务中运行,如果DDL语句失败或被取消,则所有操作都将回滚。

但是,您不能启动显式事务来回滚多个DDL语句(尚未支持)。

此外,一些语句(例如alter table语句)可能会失败,如果另一个会话在修改对象或其依赖项时具有打开的事务。您可以设置ddl_lock_timeout指定要等待Oracle可用的对象的时间。

有关DDL语句类型以及有关锁定和事务的行为的信息,请参见DDL语句摘要。

在每个DDL语句之前和之后,Oracle数据库隐式提交当前事务。


4

刚发现这个功能,需要更多调查,但是 Oracle 的 create schema authorization 至少允许将多个 DDL 语句捆绑在一个事务中,从而避免了多次提交,并且保证没有副作用,即如果任何一个 DDL 语句失败,则回滚。

目前尚不清楚回滚是否仅适用于 包装的 DDL 语句,就像创建模式启动了保存点一样,还是外部事务可能有一些先前的 DML 语句。

然而,在最后一个包装的 DDL 语句成功完成后,仍然无法避免提交。


请分享您的调查结果。快速查看链接。只能使用create table/view工作,其他DML呢? - FoxyBOA
2
不使用DML - CREATE SCHEMA AUTHORIZATION仅适用于一系列表、视图以及这些对象的授权。 - Jeffrey Kemp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接