DDL语句是否总是为您提供隐式提交,或者您是否可以获得隐式回滚?

Nic*_*int 15 sql oracle ddl transactions

如果您正在进行事务处理并执行DDL语句(例如截断表),那么事务将提交.

我想知道这是否总是如此,按照定义,或者是否有隐藏某个地方的设置会回滚事务而不是提交.

谢谢.

编辑澄清......

我不打算在截断后回滚.我只想确认已经执行的语句绝对会在DDL之前提交.只是想确保某个地方没有系统属性,有人可能会设置破坏我的代码.

据我所知,之前需要和DDL之后提交,但在概念上我还以为同样的一致性要求,可以用回退的DDL之前实现并提交后.

Jos*_*ons 17

不,它会一直提交.

如果要回滚,则必须在DDL之前执行此操作.

如果要将DDL与现有事务隔离,则必须在其自己的单独事务中执行它.

  • @Amir,我的意思是,如果您在脚本中间有一个 ddl,那么该脚本将始终在该点提交,无论您是否愿意。如果您想在不提交任何其他挂起操作的情况下执行 DDL,则需要在任何其他脚本之外执行此操作。 (2认同)

小智 16

从技术上讲,DDL在执行之前执行并在执行之后执行.

是来自Cookie的相同链接,但这是同一问题的不同方面.理解它不仅仅是一次提交至关重要,有两种提交,它们发生在之前和之后.


Gar*_*ers 6

实际上,如果可以,它将提交.如果无法成功提交,则DDL将失败.阻止它提交的一种方法是违反延迟约束.

create table fred (id number);
alter table fred add constraint id_ck check (id >0) initially deferred;
insert into fred values (-1);
SQL> create table junk(val number);
create table junk(val number)
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (GC_REF.ID_CK) violated
SQL> desc junk
ERROR:
ORA-04043: object junk does not exist
Run Code Online (Sandbox Code Playgroud)

因此,如果要阻止隐式提交,请使用具有延迟约束的虚表.在其中插入违规行,您可以确保在解决该违规(例如删除行)之前无法提交事务.