有两套结构一样的表,用view来实现切换,如下:
第一套: tableA_1, tableB_1
第二套: tableA_2, tableB_2view: viewA : create viewA as select * from tableA_1
viewB: create viewB as select * from tableB_1现在要把view 切换到第二套表:
view: viewA : create viewA as select * from tableA_2
viewB: create viewB as select * from tableB_2怎么做到上面的ddl在事务中阿? 比如create viewB失败就回滚viewA.
第一套: tableA_1, tableB_1
第二套: tableA_2, tableB_2view: viewA : create viewA as select * from tableA_1
viewB: create viewB as select * from tableB_1现在要把view 切换到第二套表:
view: viewA : create viewA as select * from tableA_2
viewB: create viewB as select * from tableB_2怎么做到上面的ddl在事务中阿? 比如create viewB失败就回滚viewA.
DDL语句是自动commit的,不知道是否可以回滚!没有具体实现过!
而且注意的是,不要在一个事务中使用ddl语句,因为(如果ddl操作成功)会自动提交它之前的所有操作。
还是自己查看命令是否执行成功,判断返回值?
给你写一下DDL的伪代码:
begin
commit;
ddl语句;
commit;
exception
when others then
rollback;
end;
看到这个我想你应该明白DDL是不能回滚的 除非恢复或是FLSEBACK
如果想在事务中加DDL语句,最好是用自治事务
这里需要说明一下,在DDL语法正确的情况下,无论语句是否执行成功,前面的事务都会自动提交无法再回滚,只有当DDL语句语法不正确的情况下才不会提交前面的事务,比如alter table tt add select number,因为字段名使用了关键字而触发语法错误,但以下语句虽然可能会执行失败,但仍然会提交之前的事务:alter table tt modify ss number,假如该列之前是字符类型并且包含不为空的行则执行将失败,但前面的事务也无法回滚,失败有这两种情况,结果却是不一样的!