首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDL语句总是给出隐式提交,还是可以得到隐式回滚?

DDL语句总是给出隐式提交,还是可以得到隐式回滚?
EN

Stack Overflow用户
提问于 2009-04-08 15:49:22
回答 8查看 49.9K关注 0票数 21

如果您正在完成一个事务,并执行一个DDL语句,例如截断一个表,那么事务将提交。

我想知道这种情况是否总是如此,根据定义,还是有一个设置隐藏在某个地方,可以回滚事务而不是提交。

谢谢。

编辑澄清.

我不想在截断后回滚。我只想确认,已经执行的声明绝对会在DDL之前提交。只想确保在某个地方没有某个系统属性可以设置为破坏我的代码。

我理解在DDL之前和之后提交的必要性,但从概念上讲,我认为在DDL之前回滚和之后提交可以实现同样的一致性要求。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-04-08 18:25:23

不,它总是会犯的。

如果您想回滚,您必须在DDL之前完成它。

如果您想将DDL与现有事务隔离开来,那么您必须在它自己的单独事务中执行它。

票数 21
EN

Stack Overflow用户

发布于 2009-04-08 20:32:50

从技术上讲,DDL在执行之前和执行之后都会执行提交。

是的,来自Cookie的相同链接,但这是同一个问题的一个不同的方面。重要的是要明白这不仅仅是一次提交,还有两次,它们就发生在之前和之后。

票数 18
EN

Stack Overflow用户

发布于 2009-04-08 22:34:51

实际上,如果可以的话,它就会提交。如果无法成功提交,DDL将失败。停止提交的一种方法是违反延迟约束。

代码语言:javascript
复制
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

因此,如果要防止隐式提交,请使用带有延迟约束的虚拟表。在其中插入违规行,您可以确保事务在该违规行为得到解决之前不会发生(例如删除行)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/730621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档