( 二十九 )、 SpringBoot 配置全局事務


( 二十九 )、 SpringBoot 配置全局事務

 

 

1、簡介

 前面我們講了 SpringBoot 基於注解 @Transactional 做事務的控制但是每個方法都添加注解還是有點麻煩, 下面我們看看如何配置全局事務管理器。

 

2、引入Aop 依賴

 <!-- aop-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

3、配置Aop切面

package com.dw.study.config; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.aop.Advisor; import org.springframework.aop.aspectj.AspectJExpressionPointcut; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionManager; import org.springframework.transaction.interceptor.*; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * @Author dw * @ClassName TransactionManagerConfig * @Description 配置全局事務 * @Date 2021/9/25 15:05 * @Version 1.0 */ @Aspect @Component public class TransactionManagerConfig { private final static Logger logger = LoggerFactory.getLogger(TransactionManagerConfig.class); /** * 配置方法過期時間,默認-1,永不超時,單位毫秒 */
    private static final int AOP_TIME_OUT = 50000; /** * Aop 切面切入點表達式 */
    private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.dw.study.service.impl.*.*(..)))"; @Autowired // private PlatformTransactionManager transactionManager;
    private TransactionManager transactionManager; @Bean public TransactionInterceptor txAdvice(){ NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); /** 查詢方法, 只讀事務,不做更新操作 */ RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute(); readOnlyTx.setReadOnly(true); readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); /** 增、刪、改 需要的事務 */ RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute(); /** 什么異常需要回滾 */ requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class))); /** 當前存在事務就使用當前事務,當前不存在事務就創建一個新的事務 */ requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); requiredTx.setTimeout(AOP_TIME_OUT); Map<String, TransactionAttribute> methodMap = new HashMap<>(); /** 可以提及事務或回滾事務的方法 */ methodMap.put("add*", requiredTx); methodMap.put("save*", requiredTx); methodMap.put("creat*", requiredTx); methodMap.put("update*", requiredTx); methodMap.put("modify*", requiredTx); methodMap.put("edit*", requiredTx); methodMap.put("insert*", requiredTx); methodMap.put("delete*", requiredTx); methodMap.put("remove*", requiredTx); methodMap.put("repair*", requiredTx); methodMap.put("binding*", requiredTx); /** 其他方法無事務,只讀 */ methodMap.put("*", readOnlyTx); source.setNameMap(methodMap); TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source); return txAdvice; } @Bean(name = "txAdviceAdvisor") public Advisor txAdviceAdvisor(TransactionInterceptor txAdvice) { logger.info("===============================創建txAdviceAdvisor==================================="); AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(AOP_POINTCUT_EXPRESSION); return new DefaultPointcutAdvisor(pointcut, txAdvice); } }

注意: 對於修改操作, 按照上面的命名規范命名方法, 否則都是只讀事務, 不可做修改操作。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM