如果您正在完成一个事务,并执行一个DDL语句,例如截断一个表,那么事务将提交。
我想知道这种情况是否总是如此,根据定义,还是有一个设置隐藏在某个地方,可以回滚事务而不是提交。
谢谢。
编辑澄清.
我不想在截断后回滚。我只想确认,已经执行的声明绝对会在DDL之前提交。只想确保在某个地方没有某个系统属性可以设置为破坏我的代码。
我理解在DDL之前和之后提交的必要性,但从概念上讲,我认为在DDL之前回滚和之后提交可以实现同样的一致性要求。
发布于 2009-04-08 18:25:23
不,它总是会犯的。
如果您想回滚,您必须在DDL之前完成它。
如果您想将DDL与现有事务隔离开来,那么您必须在它自己的单独事务中执行它。
发布于 2009-04-08 20:32:50
从技术上讲,DDL在执行之前和执行之后都会执行提交。
是的,来自Cookie的相同链接,但这是同一个问题的一个不同的方面。重要的是要明白这不仅仅是一次提交,还有两次,它们就发生在之前和之后。
发布于 2009-04-08 22:34:51
实际上,如果可以的话,它就会提交。如果无法成功提交,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因此,如果要防止隐式提交,请使用带有延迟约束的虚拟表。在其中插入违规行,您可以确保事务在该违规行为得到解决之前不会发生(例如删除行)。
https://stackoverflow.com/questions/730621
复制相似问题