Java?@Transactional指定回滾條件
異常分類

- 可查的異常(checked exceptions):Exception下除了RuntimeException外的異常
- 不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)
@Transactional注解屬性詳解
| 屬性 | 類型 | 描述 |
|---|---|---|
| value | String | 可選的限定描述符,指定使用的事務管理器 |
| propagation | enum: Propagation | 可選的事務傳播行為設置 |
| isolation | enum: Isolation | 可選的事務隔離級別設置 |
| readOnly | boolean | 讀寫或只讀事務,默認讀寫 |
| timeout | int (in seconds granularity) | 事務超時時間設置 |
| rollbackFor | Class對象數組,必須繼承自Throwable | 導致事務回滾的異常類數組 |
| rollbackForClassName | 類名數組,必須繼承自Throwable | 導致事務回滾的異常類名字數組 |
| noRollbackFor | Class對象數組,必須繼承自Throwable | 不會導致事務回滾的異常類數組 |
| noRollbackForClassName | 類名數組,必須繼承自Throwable | 不會導致事務回滾的異常類名字數 |
@Transactional
使用@Transaction注解時,阿里巴巴代碼規(guī)范插件會提醒需要指定rollbackFor以顯示的rollback

默認情況下,Spring框架在使用@Transaction處理事務時默認只在拋出運行時異常和unchecked exceptions時才會事務回滾。也就是說,當拋出個RuntimeException 或其子類例的實例時,從事務方法中拋出的Checked exceptions將不被標識進行事務回滾。
- 讓checked異?;貪L:在整個方法前加上
@Transactional(rollbackOn=Exception.class) - 讓unchecked異常不回滾:
@Transactional(dontRollbackOn=RunTimeException.class) - 不需要事務管理的(只查詢的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:
- 如果異常被try-catch了,事務就不會回滾,如果想讓事務回滾必須再往外拋
try{}catch{throw Exception}。 - Spring團隊的建議在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實現的任何接口上。也可以在接口上使用 @Transactional 注解,但是這種情況需要設置基于接口的代理時才生效
- @Transactional 注解標識的方法,建議處理過程盡量的簡單。尤其是帶鎖的事務方法,能不放在事務里面的最好不要放在事務里面??梢詫⒊R?guī)的數據庫查詢操作放在事務前面進行,而將增、刪、改等操作放在事務中
代碼
@Slf4j
@Service
public class MemberService {
? ? @Autowired
? ? private MemberMapper memberMapper;
? ? @Transactional
? ? public Integer insert(MemberEntity memberEntity) {
? ? ? ? Integer insertResult = 0;
? ? ? ? try {
? ? ? ? ? ? insertResult = memberMapper.save(memberEntity);
? ? ? ? ? ? log.info("insertResult:{}", insertResult);
? ? ? ? ? ? int result = 1 / memberEntity.getAge();
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.error("errorMsg:{}", e.getMessage());
? ? ? ? ? ? //回滾
? ? ? ? ? ? TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
? ? ? ? }
? ? ? ? return insertResult;
? ? }
}如上標紅代碼,如果不寫的話,事務是不會回滾的。因為事務被 catch 捕獲到了,所以只能手動的進行事務回滾。
到此這篇關于Java @Transactional指定回滾條件的文章就介紹到這了,更多相關Java @Transactional內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
BeanUtils.copyProperties復制對象結果為空的原因分析
這篇文章主要介紹了BeanUtils.copyProperties復制對象結果為空的原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
linux環(huán)境下java程序打包成簡單的hello world輸出jar包示例
這篇文章主要介紹了linux環(huán)境下java程序打包成簡單的hello world輸出jar包,結合簡單hello world輸出程序示例分析了Linux環(huán)境下的java可執(zhí)行jar包文件的生成相關操作技巧,需要的朋友可以參考下2019-11-11
Springboot-Starter造輪子之自動鎖組件lock-starter實現
這篇文章主要為大家介紹了Springboot-Starter造輪子之自動鎖組件lock-starter實現詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
java input 調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法
今天小編就為大家分享一篇java input 實現調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

