今天項目中需要使用到事務,所以在這里將SpringBoot的事務實現方式學習一下
SpringBoot中使用事務會使用到@Transactional這個注解來實現
先來對Transactional注解有個大致了解
1.其上注解
@Target({ElementType.METHOD, ElementType.TYPE})//METHOD:用於描述方法,TYPE:用於描述類、接口(包括注解類型) 或enum聲明
@Retention(RetentionPolicy.RUNTIME)//注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在
@Inherited//闡述了某個被標注的類型是被繼承的
@Documented//表明這個注解應該被 javadoc工具記錄
2.屬性
2.1 rollbackFor(這就是我今天使用到的屬性)
指定哪些異常需要進行事務回滾,這里可以設置異常數組,通常為RuntimeException.class、Exception.class
2.2 value和2.3 transactionManager(因為使用了AliasFor注解,value和transactionManager互為別名)
這兩個放在一起講,如果我們沒有指定,默認為上下文中聲明的名稱為“transactionManager”,pringboot會自動配置一個 DataSourceTransactionManager
2.4 propagation 默認為Propagation.REQUIRED
用於設置事務的傳播行為,業務方法需要在一個事務中運行,如果方法運行時,已處在一個事務中,那么就加入該事務,否則自己創建一個新的事務.這是spring默認的傳播行為
2.5 isolation 默認為 Isolation.DEFAULT
用於設置底層數據庫的事務隔離級別,事務隔離級別用於處理多事務並發的情況,通常使用數據庫的默認隔離級別即可,基本不需要進行設置
2.6 timeout 默認為-1,表示永不超時
用於設置事務的超時秒數
2.7 readOnly 默認為false
設置當前事務是否為只讀事務
2.8 rollbackForClassName (這個和rollbackFor最大的區別就是一個是指定異常類,一個是指定異常類名)
2.9 noRollbackFor(這個應該就是忽略哪些異常)
2.10 noRollbackForClassName(這個我覺得不需要我詳細說明了)
3.實際使用(這算是手動回滾使用)
1.首先在我們需要使用事務的Service層的方法上添加@Transactional注解
2.rollbackFor配置我們需要捕獲的哪些異常來進行事務回滾
3.其他參數按照自己實際需求來添加
4.方法中捕獲這個異常,然后調用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
注意:
1.@Transactional注解必須應用到public方法上才有效