Java?@Transactional指定回滾條件
異常分類
- 可查的異常(checked exceptions):Exception下除了RuntimeException外的異常
- 不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)
@Transactional注解屬性詳解
屬性 | 類型 | 描述 |
---|---|---|
value | String | 可選的限定描述符,指定使用的事務(wù)管理器 |
propagation | enum: Propagation | 可選的事務(wù)傳播行為設(shè)置 |
isolation | enum: Isolation | 可選的事務(wù)隔離級別設(shè)置 |
readOnly | boolean | 讀寫或只讀事務(wù),默認(rèn)讀寫 |
timeout | int (in seconds granularity) | 事務(wù)超時時間設(shè)置 |
rollbackFor | Class對象數(shù)組,必須繼承自Throwable | 導(dǎo)致事務(wù)回滾的異常類數(shù)組 |
rollbackForClassName | 類名數(shù)組,必須繼承自Throwable | 導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組 |
noRollbackFor | Class對象數(shù)組,必須繼承自Throwable | 不會導(dǎo)致事務(wù)回滾的異常類數(shù)組 |
noRollbackForClassName | 類名數(shù)組,必須繼承自Throwable | 不會導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù) |
@Transactional
使用@Transaction注解時,阿里巴巴代碼規(guī)范插件會提醒需要指定rollbackFor以顯示的rollback
默認(rèn)情況下,Spring框架在使用@Transaction處理事務(wù)時默認(rèn)只在拋出運行時異常和unchecked exceptions時才會事務(wù)回滾。也就是說,當(dāng)拋出個RuntimeException 或其子類例的實例時,從事務(wù)方法中拋出的Checked exceptions將不被標(biāo)識進行事務(wù)回滾。
- 讓checked異常回滾:在整個方法前加上
@Transactional(rollbackOn=Exception.class)
- 讓unchecked異常不回滾:
@Transactional(dontRollbackOn=RunTimeException.class)
- 不需要事務(wù)管理的(只查詢的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:
- 如果異常被try-catch了,事務(wù)就不會回滾,如果想讓事務(wù)回滾必須再往外拋
try{}catch{throw Exception}
。 - Spring團隊的建議在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實現(xiàn)的任何接口上。也可以在接口上使用 @Transactional 注解,但是這種情況需要設(shè)置基于接口的代理時才生效
- @Transactional 注解標(biāo)識的方法,建議處理過程盡量的簡單。尤其是帶鎖的事務(wù)方法,能不放在事務(wù)里面的最好不要放在事務(wù)里面??梢詫⒊R?guī)的數(shù)據(jù)庫查詢操作放在事務(wù)前面進行,而將增、刪、改等操作放在事務(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ù)是不會回滾的。因為事務(wù)被 catch 捕獲到了,所以只能手動的進行事務(wù)回滾。
到此這篇關(guān)于Java @Transactional指定回滾條件的文章就介紹到這了,更多相關(guān)Java @Transactional內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析
這篇文章主要介紹了BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解
這篇文章主要介紹了使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解,web結(jié)果由html+js+css組成,html結(jié)構(gòu)都有一定的規(guī)范,數(shù)據(jù)動態(tài)交互可以通過js實現(xiàn)。,需要的朋友可以參考下2019-06-06linux環(huán)境下java程序打包成簡單的hello world輸出jar包示例
這篇文章主要介紹了linux環(huán)境下java程序打包成簡單的hello world輸出jar包,結(jié)合簡單hello world輸出程序示例分析了Linux環(huán)境下的java可執(zhí)行jar包文件的生成相關(guān)操作技巧,需要的朋友可以參考下2019-11-11Mybatis使用JSONObject接收數(shù)據(jù)庫查詢的方法
這篇文章主要介紹了Mybatis使用JSONObject接收數(shù)據(jù)庫查詢,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12Springboot-Starter造輪子之自動鎖組件lock-starter實現(xiàn)
這篇文章主要為大家介紹了Springboot-Starter造輪子之自動鎖組件lock-starter實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05java input 調(diào)用手機相機和本地照片上傳圖片到服務(wù)器然后壓縮的方法
今天小編就為大家分享一篇java input 實現(xiàn)調(diào)用手機相機和本地照片上傳圖片到服務(wù)器然后壓縮的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題
這篇文章主要介紹了詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10