ORACLE对DDL等语句进行自动提交,DML语句可以手工提交,或者回滚事务.
但是如果出现这样的情况:
Insert into some_table values(‘Before’);Creaate table T(x int);Insert into some_table values(‘After’);Rollback;在第三条语句Insert出错时,回滚,只会回滚第三条,不会回滚前两条因为DDL语句前后都有默认的COMMIT。怎么解决这样的问题呢,只要一个出错整体回滚。
但是如果出现这样的情况:
Insert into some_table values(‘Before’);Creaate table T(x int);Insert into some_table values(‘After’);Rollback;在第三条语句Insert出错时,回滚,只会回滚第三条,不会回滚前两条因为DDL语句前后都有默认的COMMIT。怎么解决这样的问题呢,只要一个出错整体回滚。
.......
.......
.......rollback aa;
呵 可以使用PL/SQL 然后执行它
...
rollback to a;
rollback to savepoint 前执行DDL,就包含提交了这个事务就结束了。怎么可能用savepoint来实现全部回滚?
事务中严禁执行ddl,如果执行ddl,就是设计存在缺陷。
这样之前创建的Savepoint 会失效。无法返回。
还有别的方法没?
第二个语句是DML语句 insert into t2 values(2,2,2);
我想把这两个操作做成一个事务,原因是,这两个操作需要一致,也就是说如果其中一个出错,两个语句都必须回滚,否则会造成结果的不一致性,
就像银行转账一样,转账过程出错,双方必须都回滚到原始状态,否则会出现一致性错误
这是关系型数据库必须满足的ACID测试。
如果你的执行顺序:DML-DDL-DML,然后还能回滚全部DML,这就不是关系型数据库了。
一个DDL和一个DML?DDL就没有回滚一说。
DML语句出现错误时需要回滚,我想连DDL语句一起回滚可以实现吗?(不回滚会出现一致性问题)
现在就是需要这样的功能
exception
when others then
Rollback;
drop T;
执行DDL时内部就包含了COMMIT,所以对DDL不存在回滚。