• springboot实现全局事务管理


    前言

    首先需要实现全局事务管理,你得知道事务的原理包括一些事务的基础概念
    事务源码解析

    代码演示

    import org.apache.ibatis.transaction.TransactionFactory;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.aop.Advisor;
    import org.springframework.aop.aspectj.AspectJExpressionPointcut;
    import org.springframework.aop.support.DefaultPointcutAdvisor;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Lazy;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.TransactionManager;
    import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
    import org.springframework.transaction.interceptor.RollbackRuleAttribute;
    import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
    import org.springframework.transaction.interceptor.TransactionInterceptor;
    import java.util.Collections;
    
    /**
     * 全局事务
     * @author fh
     * @date 2022-08-11
     * @since 3.1.0
     */
    @Aspect
    @Configuration
    @ConditionalOnClass({TransactionManager.class, TransactionFactory.class})
    public class TransactionAdviceConfig {
    
        private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.abupdate..*.service.*.*(..))";
    
        @Lazy
        private TransactionManager transactionManager;
    
        /**
         * 事务拦截器
         * @return
         */
        @Bean
        public TransactionInterceptor txAdvice() {
    
            RuleBasedTransactionAttribute txAttrRequired = new RuleBasedTransactionAttribute();
            //支持一个已经存在的事务。如果没有事务,则开始一个新的事务;
            txAttrRequired.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            txAttrRequired.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
            //设置只读
            RuleBasedTransactionAttribute txAttrRequiredReadonly = new RuleBasedTransactionAttribute();
            txAttrRequiredReadonly.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            txAttrRequiredReadonly.setReadOnly(true);
    
            NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
            //可以提交事务或回滚事务的方法
            source.addTransactionalMethod("insert*", txAttrRequired);
            source.addTransactionalMethod("save*", txAttrRequired);
            source.addTransactionalMethod("add*", txAttrRequired);
            source.addTransactionalMethod("create*", txAttrRequired);
            source.addTransactionalMethod("delete*", txAttrRequired);
            source.addTransactionalMethod("remove*", txAttrRequired);
            source.addTransactionalMethod("update*", txAttrRequired);
            source.addTransactionalMethod("modify*", txAttrRequired);
            source.addTransactionalMethod("exec*", txAttrRequired);
            source.addTransactionalMethod("set*", txAttrRequired);
            source.addTransactionalMethod("reset*", txAttrRequired);
            source.addTransactionalMethod("batch*", txAttrRequired);
            source.addTransactionalMethod("lock*", txAttrRequired);
            source.addTransactionalMethod("register*", txAttrRequired);
            //其他方法无事务,只读
            source.addTransactionalMethod("*", txAttrRequiredReadonly);
    
            return new TransactionInterceptor(transactionManager, source);
        }
    
        @Bean
        public Advisor txAdviceAdvisor() {
            AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
            pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
            return new DefaultPointcutAdvisor(pointcut, txAdvice());
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    注意

    关于事务全局管理如何使用:就是你如果需要对某个业务方法进行事务管理纳入全局的话,首先方法名需要满足上面几个前缀,否则只能归类韦其他方法无事务,只读
    source.addTransactionalMethod(“*”, txAttrRequiredReadonly);

  • 相关阅读:
    OPengl学习——初识opengl
    【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)
    二分查找:如何快速定位IP对应的省份地址?
    HOOPS Commuicator:基于Web的交互式2D/3D图形轻量化引擎
    缓存把我坑惨了..
    js内容混淆,返回内容加密
    ChatGPT之道:巧用写作技巧
    零基础html学习/刷题-第三期
    web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作
    Security的内容
  • 原文地址:https://blog.csdn.net/lucky_love816/article/details/133710684