小弟的存储过程有两个DML语句,我担心前一个执行一个成功了,后面了失败的情况,就在每个DML语句
之后都加上ROOLBACK语句,需要吗,有一种说法是:如果只有一句DML语句的话可以不用加ROLLBACK
(我的理解是不是ORACLE 会隐式ROOLBACK)
如果有两条以上DML操作的话,就需要加上了,我在两句DML语句都没有异常的情况写
一并COMMIT的,大家看我下面贴上的写法严谨吗,如果不合适,请指教!!!  BEGIN       ......
       ......
       ......        BEGIN
        
        UPDATE  CUR_TRAN_RECORD
        SET LASTUPDATE = TO_CHAR(SYSDATE,'YYYYMMDD'),
            STARTDATE = I_STARTDATE,
            ENDDATE = I_ENDDATE
        WHERE ACCNO =  I_ACCNO
        AND   SUBACC = I_SUBACC
        AND   (STARTDATE IS NULL AND ENDDATE IS NULL);
        
        EXCEPTION
           WHEN OTHERS THEN
           O_RETCODE :='EBPT070001'|| '*' ||'errorcode:'||sqlcode||'  errmessage:'||sqlerrm;
          
          ROLLBACK;
          
          RETURN;
          
      END;
        
      BEGIN  
        
        DELETE  FROM  CUR_TRAN_RECORD
        WHERE ACCNO = I_ACCNO
        AND   SUBACC = I_SUBACC
        AND   ( STARTDATE  <> I_STARTDATE OR ENDDATE <> I_ENDDATE);
        EXCEPTION
           WHEN OTHERS THEN
           O_RETCODE :='EBPT070002'|| '*' ||'errorcode:'||sqlcode||'  errmessage:'||sqlerrm;
            
           ROLLBACK;
            
           RETURN;
      END;
      
      COMMIT;      ......
      ......
      ......END CORE_QUERY;

解决方案 »

  1.   

    不需要写两个ROLLBACK。
    一个即可。
    因为Rollback操作会对之前所有表的操作都进行Rollback
    Commit操作会对之前所有表的成功操作都进行Commit。一定会是一致的。
      

  2.   

    lz的rollback后紧跟了一个return,只要有一个跑进异常,后面的代码就不会执行了,所以不会影响后面的逻辑。同时rollback或者commit是session级的,前面没有提交(或回滚)的在这个时候都会回滚或提交。
      

  3.   

    如果你不是自主事务: AUTONOMOUS_TRANSACTION
    你的过程中只要有异常,整个过程是不会执行成功的.
    事务中的所有动作要么都发生,要么都不发生