通過Spring層面進(jìn)行事務(wù)回滾的實現(xiàn)
Spring 中事務(wù)可以分為聲明式事務(wù)和編程式事務(wù),那么解下來就從這兩方面說一說在 Spring 層面?zhèn)€怎么進(jìn)行回滾
聲明式事務(wù)回滾:
1. 基礎(chǔ)注解配置
通過@Transactional注解實現(xiàn)自動回滾,默認(rèn)對RuntimeException和Error生效
@Transactional public void transferMoney(Account from, Account to, double amount) { from.withdraw(amount); // 扣款 to.deposit(amount); // 存款 // 若在此處拋出RuntimeException,事務(wù)自動回滾 }
2. 指定回滾異常類型
可以通過 @Transactional 注解的 rollbackFor 參數(shù)擴(kuò)展回滾范圍到受檢異常
@Transactional(rollbackFor = {SQLException.class, BusinessException.class}) public void processOrder(Order order) throws CustomException { // 拋出SQLException或BusinessException時回滾 }
需要顯示聲明受檢查異常類型,否則不會滾
3. ?不回滾特殊場景
使用 noRollbackFor 參數(shù)排除特定異常
@Transactional(noRollbackFor = {ValidationException.class}) public void validateData(Data data) { // ValidationException不會觸發(fā)回滾 }
編程式事務(wù)回滾:
1. ?使用 TransactionTemplate 實現(xiàn)編程式事務(wù)
@Autowired private TransactionTemplate transactionTemplate; public void batchProcess() { transactionTemplate.execute(status -> { try { // 業(yè)務(wù)操作... if (errorCondition) status.setRollbackOnly(); return result; } catch (Exception e) { status.setRollbackOnly(); throw e; } }); }
2. 使用 ?PlatformTransactionManager 實現(xiàn)編程式事務(wù)
直接操作事務(wù)管理器實現(xiàn)完全控制
@Autowired private PlatformTransactionManager transactionManager; public void complexOperation() { TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { // 業(yè)務(wù)操作... transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); throw new ServiceException("操作失敗", e); } }
嵌套事務(wù)與傳播行為相關(guān)的異?;貪L:
1. 嵌套事務(wù)(PROPAGATION_NESTED)
子事務(wù)作為父事務(wù)的保存點(diǎn),可部分回滾
@Transactional(propagation = Propagation.REQUIRED) public void parentMethod() { // 主業(yè)務(wù)邏輯 childMethod(); // 嵌套子事務(wù) } @Transactional(propagation = Propagation.NESTED) public void childMethod() { // 子事務(wù)操作,失敗僅回滾子操作 }
2.傳播行為控制
通過傳播策略控制事務(wù)邊界:
REQUIRES_NEW:始終新建事務(wù)
MANDATORY:必須存在父事務(wù)
NOT_SUPPORTED:非事務(wù)執(zhí)行
通過 xml 的方式配置全局回滾規(guī)則:
<tx:advice id="txAdvice"> <tx:attributes> <tx:method name="save*" rollback-for="java.lang.Exception"/> <tx:method name="update*" no-rollback-for="BusinessWarning"/> </tx:attributes> </tx:advice>
到此這篇關(guān)于通過Spring層面進(jìn)行事務(wù)回滾的實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring事務(wù)回滾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+logback默認(rèn)日志的配置和使用方式
這篇文章主要介紹了SpringBoot+logback默認(rèn)日志的配置和使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConver
這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08java使用socket實現(xiàn)一個多線程web服務(wù)器的方法
今天小編就為大家分享一篇java使用socket實現(xiàn)一個多線程web服務(wù)器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Java AbstractMethodError原因案例詳解
這篇文章主要介紹了Java AbstractMethodError原因案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08