一、介紹
@Transactional是建立在AOP基礎上的,它的本質是對方法的前后進行攔截,在目標方法開始前創建一個事務,在目標方法運行結束時根據運行的情況進行提交或者回滾操作。使用@Transactional不會對代碼造成污染,使用起來簡單便捷。
二、相關的配置
-
readOnly:該屬性用於設置當前事務是否為只讀事務,設置為true表示只讀,false則表示可讀寫,默認值為false。例如:@Transactional(readOnly=true);
-
rollbackFor: 該屬性用於設置需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,則進行事務回滾。例如:指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class});
-
rollbackForClassName: 該屬性用於設置需要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,則進行事務回滾。例如:指定單一異常類名稱@Transactional(rollbackForClassName=”RuntimeException”)指定多個異常類名稱:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})。
-
noRollbackFor:該屬性用於設置不需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,不進行事務回滾。例如:指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)指定多個異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})。
-
noRollbackForClassName:該屬性用於設置不需要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,不進行事務回滾。例如:指定單一異常類名稱:@Transactional(noRollbackForClassName=”RuntimeException”)指定多個異常類名稱:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})。
-
propagation : 該屬性用於設置事務的傳播行為。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)。
-
isolation:該屬性用於設置底層數據庫的事務隔離級別,事務隔離級別用於處理多事務並發的情況,通常使用數據庫的默認隔離級別即可,基本不需要進行設置。
-
timeout:該屬性用於設置事務的超時秒數,默認值為-1表示永不超時。
三、注意事項
-
事務@Transactional的使用必須要放在類的公共public方法中,如果將事務放在protected、private方法上時,他不會報錯,但事務無效。
-
一個未加@Transactional的父方法A在調用加了@Transactional的子方法B時,若在A中拋出異常,那么事務不會回滾;反之,一個加了@Transactional的父方法A在調用未加@Transactional的子方法B時,若在A中拋出異常,事務仍然生效。
-
事務的回滾必須有異常拋出,如果加了@Transactional的方法在捕獲了異常卻自己處理了該異常,那么事務不會進行回滾。