我有以下程序:
procedure mayFailProc() as
begin
insert into t1 (id, val) values (1, '123');
insert into t1 (id, val) values (2, '123');
insert into t1 (id, val) values (3, '123'); //fails, i.e. due to pk uniqueness error
end;
mayFailProc
中抛出的这个异常是正常的,它由调用者处理。因此,事务不会回滚并继续执行,就像mayFailProc
中没有异常一样。我想知道前两个成功执行插入会发生什么?他们会被保留还是不被保留?
答案 0 :(得分:3)
见here for Oracle's explanation。您可以跳转到Oracle Oracle Implicit Rollbacks部分开始。
在执行INSERT,UPDATE或DELETE语句之前,Oracle会标记 隐式保存点(对您不可用)。如果声明失败, Oracle回滚到保存点。通常,只是失败的SQL 语句被回滚,而不是整个事务。如果声明 引发一个未处理的异常,主机环境决定了什么 回滚。
更多:
您应该显式提交或回滚每个事务。是否 您在PL / SQL程序中或从a发出提交或回滚 客户端程序取决于应用程序逻辑。如果你不提交 或显式回滚事务,即客户端环境 确定其最终状态。
例如,在SQL * Plus环境中,如果您的PL / SQL块有 不包括COMMIT或ROLLBACK语句,你的最终状态 事务取决于运行块后您执行的操作。如果你 执行数据定义,数据控制或COMMIT语句,或者如果您执行 发出EXIT,DISCONNECT或QUIT命令,Oracle提交 交易。如果执行ROLLBACK语句或中止SQL * Plus 会话,Oracle回滚了该事务。
答案 1 :(得分:0)
刚刚做了一个快速测试......当第三个插入导致“唯一约束......违反”错误时,我的测试中的行未被保留