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