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

问题描述 投票:1回答:2

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有何不同。

oracle11g oracle-sqldeveloper rollback oracleexception
2个回答
1
投票

这就是Oracle的工作方式。您的第一个INSERT已正确完成(即将“1”插入表中)。

然后你运行了一个匿名PL / SQL块,它插入“3”,然后是“2”,并在尝试插入“1”时由于主键违规而失败。

如果在执行该PL / SQL块期间发生未处理的异常(这就是您所说的“Oracle异常处理程序回滚到此处”),Oracle将回滚到PL / SQL块的开头。

当您使用EXCEPTION处理程序并发出ROLLBACK时,如果发生某些事情,那么您决定该怎么做,那就是将所有更改还原到之前的COMMIT,这是在执行CREATE TABLE语句后隐式执行的COMMIT,因此在INSERT“1之后“也回滚了。


0
投票

将任何DML语句视为原子事务,您将BEGIN ... END分组为几个语句作为原子事务,而内部异常将导致回滚此块中的语句。使用SAVEPOINT可以更好地处理回滚方案。

© www.soinside.com 2019 - 2024. All rights reserved.