日期:2014-05-16  浏览次数:20410 次

(转)oracle 存储过程事务使用断点回滚 ---savepoint

学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题,那就是使用断点回滚后,都忘记了一个很重要的事情,提交事务。虽然使用了断点回滚,但是断点回滚不像rollBack或commit一样结束当前事务,而使用断点回滚只会回滚到声明断点的地方,之前的产生的事务仍需要提交的,如果不提交,事务一直在数据库中缓存.

Demo:
??? procedure doSomeThing(p_number out number) as
??? begin
????? insert into t_test_user_mingming(id,loginname,password,realname,type)
?????? values(se_test_user_mingming_id.nextval,'xiaoming','1234','小明',1);
?????? p_number := 1;
??? savepoint ps;--- 设置断点 ps?
??? insert into t_test_info_mingming(id,pal,type,create_time,note)
????? values(se_test_info_id.nextval,'我想买台thinkPad 可以俺莫有钱',1,sysdate,'ceshi');
????? p_number := 2;
???? savepoint sp;----设置断点 sp
??? insert into t_test_agent(agent_id) values(1);---我这里此行会抛出异常 ORA-01400? 可以替换为下句 手动抛出一个异常

????? -----RAISE_APPLICATION_ERROR (-20004,'抛出的异常玩玩');?
??? commit;
??? exception? --捕获异常
?????? when others then
????????? rollback to ps;? ---- 如果产生异常,回滚到断点 ps?
????????? p_number :=0;
????????? commit;? --- 提交事务
??? end doSomeThing;

这里本人做了实验,如果在异常中不加 commit 语句,使用PL/SQL测试时,异常在缓存,t_test_user_mingming 表中没有数据记录。

?

?

存储过程里的事务操作:


is

temp?:=?p_count;??/*将返回值赋给临时变量*/





??????when???others???then???
?????????return;?
end;

?

?

??? 保存点(SAVEPOINT)是事务处理过程中的一个标志,与回滚命令