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

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

默認(rèn)情況下,Spring框架在使用@Transaction處理事務(wù)時(shí)默認(rèn)只在拋出運(yùn)行時(shí)異常和unchecked exceptions時(shí)才會(huì)事務(wù)回滾。也就是說,當(dāng)拋出個(gè)RuntimeException 或其子類例的實(shí)例時(shí),從事務(wù)方法中拋出的Checked exceptions將不被標(biāo)識(shí)進(jìn)行事務(wù)回滾。
- 讓checked異常回滾:在整個(gè)方法前加上
@Transactional(rollbackOn=Exception.class) - 讓unchecked異常不回滾:
@Transactional(dontRollbackOn=RunTimeException.class) - 不需要事務(wù)管理的(只查詢的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:
- 如果異常被try-catch了,事務(wù)就不會(huì)回滾,如果想讓事務(wù)回滾必須再往外拋
try{}catch{throw Exception}。 - Spring團(tuán)隊(duì)的建議在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實(shí)現(xiàn)的任何接口上。也可以在接口上使用 @Transactional 注解,但是這種情況需要設(shè)置基于接口的代理時(shí)才生效
- @Transactional 注解標(biāo)識(shí)的方法,建議處理過程盡量的簡(jiǎn)單。尤其是帶鎖的事務(wù)方法,能不放在事務(wù)里面的最好不要放在事務(wù)里面??梢詫⒊R?guī)的數(shù)據(jù)庫查詢操作放在事務(wù)前面進(jìn)行,而將增、刪、改等操作放在事務(wù)中
代碼
@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;
? ? }
}如上標(biāo)紅代碼,如果不寫的話,事務(wù)是不會(huì)回滾的。因?yàn)槭聞?wù)被 catch 捕獲到了,所以只能手動(dòng)的進(jìn)行事務(wù)回滾。
到此這篇關(guān)于Java @Transactional指定回滾條件的文章就介紹到這了,更多相關(guān)Java @Transactional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot?+rabbitmq+redis實(shí)現(xiàn)秒殺示例
本文主要介紹了springboot?+rabbitmq+redis實(shí)現(xiàn)秒殺示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
數(shù)組和二維數(shù)組感覺用王者榮耀的裝備欄來舉例解釋,應(yīng)該更易懂一些。從基礎(chǔ)開始講,后續(xù)會(huì)講到JAVA高級(jí),中間會(huì)穿插面試題和項(xiàng)目實(shí)戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
SpringBoot緩存預(yù)熱實(shí)戰(zhàn)
緩存預(yù)熱是一種常見的優(yōu)化策略,旨在提高系統(tǒng)的響應(yīng)速度和性能,本文主要介紹了SpringBoot緩存預(yù)熱實(shí)戰(zhàn)指南,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Springcloud-nacos實(shí)現(xiàn)配置和注冊(cè)中心的方法
這篇文章主要介紹了Springcloud-nacos實(shí)現(xiàn)配置和注冊(cè)中心的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Java中保證多線程間的數(shù)據(jù)共享的方法詳解
這篇文章詳解的發(fā)給大家介紹了Java中是如何保證多線程間的數(shù)據(jù)共享的,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-11-11
Java線程編程中Thread類的基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了Java線程編程中Thread類的基礎(chǔ)學(xué)習(xí)教程,Thread類包含諸多操作線程的方法,非常重要,需要的朋友可以參考下2015-12-12最新評(píng)論

