Nic*_*int 15 sql oracle ddl transactions
如果您正在进行事务处理并执行DDL语句(例如截断表),那么事务将提交.
我想知道这是否总是如此,按照定义,或者是否有隐藏某个地方的设置会回滚事务而不是提交.
谢谢.
编辑澄清......
我不打算在截断后回滚.我只想确认已经执行的语句绝对会在DDL之前提交.只是想确保某个地方没有系统属性,有人可能会设置破坏我的代码.
据我所知,之前需要和DDL之后提交,但在概念上我还以为同样的一致性要求,可以用回退的DDL之前实现并提交后.
Jos*_*ons 17
不,它会一直提交.
如果要回滚,则必须在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
Run Code Online (Sandbox Code Playgroud)
因此,如果要阻止隐式提交,请使用具有延迟约束的虚表.在其中插入违规行,您可以确保在解决该违规(例如删除行)之前无法提交事务.
| 归档时间: |
|
| 查看次数: |
42063 次 |
| 最近记录: |