不要DDL语句总是给你一个隐含的承诺,或者你可以得到一个隐含的回滚?
-
06-09-2019 - |
题
如果您通过交易已经完成了一半,并执行DDL语句,如截断表,然后事务提交。
我不知道这是否是永远的情况下根据定义,或者是有什么地方隐藏着一个设置,将回滚的交易,而不是承诺。
感谢。
修改澄清... 强>
我不是在寻找一个截断后回滚。我只是想确认已经进行了声明的绝对总是的将是一个DDL之前提交。只是要确保没有一个系统属性的某个地方有人可以设置为破坏我的代码。
据我所知,之前需要和DDL之后提交,但在概念上我还以为同样的一致性要求的可能的与回滚的DDL之前达到后提交。
解决方案
没有,它将始终提交。
如果您要回滚,您将有DDL之前做到这一点。
如果您想将DDL从现有的事务隔离,那么你将不得不在其自己的,独立的事务来执行它。
其他提示
是从曲奇同一链路但这是同一个问题的不同方面。这是理解它不只是一个承诺至关重要,有两个,他们只是之前和之后刚刚发生。
其实这就会犯,如果它可以。如果无法成功提交,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
所以,如果你想阻止一个隐含的承诺,有一个延迟的约束的虚拟表。插入违反排它,你可以确保事务不能被提交,直到解决违规问题(例如,行删除)。
一个的截断表或一个的改变表或一个创建表强>不总是导致提交。
为什么你要当你做一个截断表回滚办?
“我想知道为什么DDL语句不是一个自治事务内部执行(样序列做),因此它们也不会转回去影响任何未决的用户事务...
你能澄清?
跟帖2003年6月24日 - 早上7点美国/东:
这将称为“混淆”为没有这样做的方式。反正,你所以如果你愿意,你就可以有ATRANS。 “
所以,如果你真的需要,你可以坚持一个自治事务中的DDL,做你想做的。
编辑: 底线是,除非你去明确的长度,以“颠覆”甲骨文,DDL将要进行提交。这就是说,如果你绝对需要在某一点进行提交,为什么不执行它明确?
DDL语句总是执行自动提交,执行后。
如果您希望它在故障(在服务器端)的情况下,回退,则可以设置某些标志,以指示失败,并采取适当的行动。
例如: 如果你创建了一个表table1。 并且在同一时间要插入的记录中的其他表中。
但插入失败,由于某些原因(设定标志=真)。然后在这种情况下 不能作为回滚创建语句是一个DDL语句,这样就可以通过删除语句滴取决于标志的值的表(表1),撤消在数据库中的改变。
我同意DCookie和汤姆对自治事务。我打算也注明。
实施例的伪代码:
Do some DML
Call autonomous function, that performs DDL
Do some more DML
rollback or commit all the DML - your choice
我不认为这为非常有用的,但。如果最初的DML和DDL触摸同桌/对象,它是行不通的。当您尝试执行DDL你会得到的争夺。就像任何两个事务相互阻塞。如果他们是独立的对象,我想我不明白为什么执行顺序的问题。
“始终/从不”太强。例如DDL像从Oracle 18C CREATE PRIVATE TEMPORARY TABLE
不会COMMIT
您的交易。
正常情形:
CREATE TABLE t(i INT);
INSERT INTO t(i) VALUES(21);
CREATE TABLE x(i INT); -- same for CREATE GLOBAL TEMPORARY TABLE y(i INT);
ROLLBACK;
SELECT * FROM t;
-- Output:
-- 21
但是,如果你创建专用表:
CREATE TABLE t(i INT);
INSERT INTO t(i) VALUES(21);
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_temp(i INT);
-- or
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_tab
AS
SELECT 1 AS c FROM dual;
ROLLBACK;
SELECT * FROM t;
-- Output:
-- no data found
<强> 分贝<>拨弄演示 强>