Spring事務超時、回滾的相關說明


事務超時:
@Transactional(timeout = 60)
如果用這個注解描述一個方法的話,線程已經跑到方法里面,如果已經過去60秒了還沒跑完這個方法並且線程在這個方法中的后面還有涉及到對數據庫的增刪改查操作時會報事務超時錯誤(會回滾)。
如果已經過去60秒了還沒跑完但是后面已經沒有涉及到對數據庫的增刪改查操作,那么這時不會報事務超時錯誤(不會回滾)。
 
答案是  RuntimeException或者Error。
注意:如果事務在try{}catch( Exception e){e.printStackTrace();}中跑,並且catch中只是打印e的話,那么事務不會rollback。因為異常被catch掉了,框架不知道發生了異常。
如果想要rollback,可以加上rollbackFor=Exception.class,然后:
在方法上添加 throws  Exception,將方法中出現的異常拋出給spring事務,
②去掉方法體中的try catch
③catch (Exception e) {  throw e;}繼續向上拋,目的是讓spring事務捕獲這個異常。
rollbackFor=Exception.class,catch(){
    throw new RunTimeException();
}
如果不加rollbackFor=Exception.class,拋出new Exception() 是不會回滾的。Spring源碼如下:
public boolean rollbackOn(Throwable ex) { 
     return (ex instanceof RuntimeException || ex instanceof Error);
如果是RuntimeException或Error的話,就返回True,表示要回滾,否則返回False,表示不回滾。
只有spring事務捕獲到Exception異常后,@Transactional(rollbackFor=Exception.class),才會起到應有的作用;catch (Exception e) {            e.printStackTrace();        }這句是捕獲try中出現的Exception然后將異常信息打印出來,僅僅是打印出來,然后什么也沒干。

@Transactional(timeout = 60,rollbackFor=Exception.class)與rollbackFor=Exception.class的作用是1 讓checked例外也回滾:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
2 讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
checked Unchecked exception是運行時錯誤。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM