那么Oracle异常处理程序中的“ROLLBACK”与我的“ROLLBACK”有什么不同呢?

时间:2018-01-03 14:27:35

标签: oracle11g oracle-sqldeveloper rollback oracleexception

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异常处理程序中的ROLLBACKROLLBACK的不同。

2 个答案:

答案 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更好地处理回滚方案。