( 二十九 )、 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