1

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) Incase of oracle handling exception

mytable 
_______
1

2) 发生oracle处理异常

mytable 
_______

那么ROLLBACKOracle 异常处理程序与我的ROLLBACK.

4

2 回答 2

1

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

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

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

当您使用 EXCEPTION 处理程序并发出 ROLLBACK 时,您将决定如果发生某些事情该怎么办,那就是将所有更改恢复到先前的 COMMIT,这是在执行 CREATE TABLE 语句后隐式完成的 COMMIT,因此遵循 INSERT "1 "也被回滚。

于 2018-01-03T16:58:14.690 回答
0

将任何 DML 语句视为原子事务,您将在 BEGIN ... END 中将多个语句分组为原子事务,内部的异常将导致该块中的语句回滚。使用 SAVEPOINT 更好地处理回滚场景。

于 2018-01-03T15:07:47.323 回答