(转)oracle存储过程的事务处理及事务使用断点回滚

1、事务用于确保数据的一致性,由一组相关的DML语句组成,该组DML语句所执行的操作要么全部确认,要么全部取消。
2、当执行事务操作(DML)时,Oracle会在被作用的表上加锁,以防止其他用户改变表结构,同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作。
3、当执行事务提交或事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁。
4、提交事务(COMMIT)确认事务变化,结束当前事务、删除保存点,释放锁,使得当前事务中所有未决的数据永久改变。
5、保存点(SAVEPOINT)在当前事务中,标记事务的保存点。
6、回滚事务(ROLLBACK)回滚整个事务,删除该事务所定义的所有保存点,释放锁,丢弃所有未决的数据改变。
7、回滚事务到指定的保存点(ROLLBACK TO SAVEPOINT)回滚当前事务到指定的保存点,丢弃该保存点创建后的任何改变,释放锁。
8、当执行DDL、DCL语句,或退出SQL*PLUS时,会自动提交事务;
9、事务期间应避免与使用者互动;
10、查询数据期间,尽量不要启动事务;
11、尽可能让事务持续地越短越好;
12、在事务中尽可能存取最少的数据量
        

案例:

复制代码
create or replace procedure stu_proc
(
v_id
in number ,
v_name
in varchar2 ,
v_age
in number ,
v_msg out
varchar2
)
as
begin
insert into student(id, sname, age) values (v_id, v_name, v_age);
commit ;
v_msg:
= ' 添加成功 ' ;
exception
when others then
rollback ;
v_msg:
= ' 失败成功 ' ;
RAISE_APPLICATION_ERROR(
- 20010 , ' ERROR:违反唯一索引约束! ' );
end ;
create   or   replace   procedure  delete_exceed_bound(playtype   varchar2 , end07   varchar2  , end08   varchar2 )
  
is

  
begin
    
delete  lotterydate  where  lotterydate.playtype = playtype  and   lotterydate.lotterydate_name > end07  and  lotterydate.lotterydate_name  like   ' 07% ' ;
    
delete  lotterydate  where  lotterydate.playtype = playtype  and   lotterydate.lotterydate_name > end08  and  lotterydate.lotterydate_name  like   ' 08% ' ;
    savepoint p1;
    
delete  province_sell_amounts  where  province_sell_amounts.play_no = playtype  and  province_sell_amounts.term > end07  and  province_sell_amounts.term  like   ' 07% ' ;
    
delete  province_sell_amounts  where  province_sell_amounts.play_no = playtype  and  province_sell_amounts.term > end08  and  province_sell_amounts.term  like   ' 08% ' ;

    
delete  province_winning_prize  where  province_winning_prize.play_no = playtype  and  province_winning_prize.term > end07  and  province_winning_prize.term  like   ' 07% ' ;
    
delete  province_winning_prize  where  province_winning_prize.play_no = playtype  and  province_winning_prize.term > end08  and  province_winning_prize.term  like   ' 08% ' ;
    savepoint p2;
    
delete  condition_winning_prize  where  condition_winning_prize.play_no = playtype  and  condition_winning_prize.term > end07  and  condition_winning_prize.term  like   ' 07% ' ;
    
delete  condition_winning_prize  where  condition_winning_prize.play_no = playtype  and  condition_winning_prize.term > end08  and  condition_winning_prize.term  like   ' 08% ' ;
    savepoint p3;
    
delete  open_result  where  open_result.play_no = playtype  and  open_result.term > end07  and  open_result.term  like   ' 07% ' ;
    
delete  open_result  where  open_result.play_no = playtype  and  open_result.term > end08  and  open_result.term  like   ' 08% ' ;


  exception
      
when  others  then
        dbms_output.put_line(sqlerrm);
        
rollback   to  savepoint p1;
  
end  delete_exceed_bound;
保存点 (SAVEPOINT) 是事务处理过程中的一个标志,与回滚命令 (ROLLBACK) 结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务。

 

如果定义了多个savepoint,当指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了Nsavepoint)。

在一段处理中定义了3个savepoint,从第2个savepoint回滚,后面的第3个标记的操作都将被回滚,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,将会滚整个事务处理。

猜你喜欢

转载自ruotongsong.iteye.com/blog/1856238