Oracle数据库如何回滚到PL / SQL块的开头,而不是早期的DML指令(我认为所有这些都在一个单一的事务中)。因为当我尝试ROLLBACK
创建异常处理程序时,所有指令都会被回滚到最后COMMIT
。
create table mytable (num int not null primary key);
insert into mytable values(1); // My ROLLBACK, rollbacks to here.
begin // Oracle exception handler rollbacks to here.
insert into mytable values(3);
begin
insert into mytable values(2);
insert into mytable values(1);
end;
/* Incase I try to ROLLBACK all the updates including the first insert is gone.*/
--exception when dup_val_on_index then
--rollback;
end;
决赛桌数据:
1)包含oracle处理异常
mytable
_______
1
2)包含oracle处理异常
mytable
_______
那么Oracle异常处理程序中的ROLLBACK
与ROLLBACK
的不同。
答案 0 :(得分:1)
这就是Oracle的工作方式。您的第一个INSERT已正确完成(即将“1”插入表中)。
然后你运行了一个匿名的PL / SQL块,它插入“3”,然后是“2”,并且由于主键冲突而尝试插入“1”时失败。
如果在执行该PL / SQL块期间发生未处理的异常(这就是您所说的“Oracle异常处理程序回滚到此处”),Oracle将回滚到PL / SQL块的开头。
当您使用EXCEPTION处理程序并发出ROLLBACK时,如果发生某些事情,那么您决定该怎么做,那就是将所有更改还原到之前的COMMIT,这是在执行CREATE TABLE语句后隐式执行的COMMIT,所以INSERT“1”也会回滚。
答案 1 :(得分:0)
将任何DML语句视为原子事务,您将BEGIN ... END分组为几个语句作为原子事务,而内部异常将导致回滚此块中的语句。 使用SAVEPOINT更好地处理回滚方案。