SavePoint (bzszp )
2024-07-21 02:08:19
供稿:網友
保存點(savepoint)是事務處理過程中的一個標志,與回滾命令(rollback)結合使用,主要的用途是允許用戶將某一段處理回滾而不必回滾整個事務,這在pl/sql開發中還是很有用處的。
下面的例子中,把savepoint標記在insert語句之前,如果這條insert語句試圖將重復的數據保存到emp表中的話,將觸發執行預先定義的dup_val_on_index例外處理,在這里面的rollback to do_insert命令將回滾上面的那條insert操作,而不會影響前面的任何操作。
declare
emp_id emp.empno%type;
begin
update emp set ... where empno = emp_id;
delete from emp where ...
...
savepoint do_insert;
insert into emp values (emp_id, ...);
exception
when dup_val_on_index then
rollback to do_insert;
end;
如果你定義了多個savepoint,當你指定回滾到某個savepoint時,那么回滾操作將回滾這個savepoint后面的所有操作(即使后面可能標記了n個savepoint)。例如,在一段處理中
你定義了五個savepoint,從第三個savepoint回滾,后面的第四、第五個標記的操作都將被回滾,如果不使用rollback to savepoint_name而使用rollback,將會滾整個事務處理。
如果你在遞歸子程序里面定義了一個savepoint, 如果每一個遞歸層都設置了savepoint. 此時, 你只能回滾到最近的一個savepoint.
savepoint的聲明可以在同一個事務處理里面重復定義. 它的作用就是把savepoint從上一個位置轉移到目前的位置. 因而,執行回滾也只回滾到最近的savepoint.
下面是一個例子:
begin
...
savepoint my_point;
update emp set ... where empno = emp_id;
...
savepoint my_point; -- move my_point to current point
insert into emp values (emp_id, ...);
exception
when others then
rollback to my_point;
end;
另外,oracle沒有對每個session里面可以使用的savepoint個數做限制.