1. 程式人生 > >Spring事務超時、回滾的相關說明

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

rollback family 數據庫 span ransac return urn 出現 trac

事務超時: @Transactional(timeout = 60) 如果用這個註解描述一個方法的話,線程已經跑到方法裏面,如果已經過去60秒了還沒跑完這個方法並且線程在這個方法中的後面還有涉及到對數據庫的增刪改查操作時會報事務超時錯誤(會回滾)。 如果已經過去60秒了還沒跑完但是後面已經沒有涉及到對數據庫的增刪改查操作,那麽這時不會報事務超時錯誤(不會回滾)。 回滾: Spring管理事務默認回滾的異常是什麽? 答案是 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是運行時錯誤。

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