zoukankan      html  css  js  c++  java
  • 转载 Spring boot中配置事务管理

    一、注解的方式

    1. 在Spring boot工程的主入口类中加入注解

    // 开启事务支持
    @EnableTransactionManagement
    
    • 1
    • 2

    添加事务注解

    2. 在需要事务支持的服务类(class)或方法(method)上,加上注解并设置其属性

    /* 
     * 表明该类(class)或方法(method)受事务控制
     * @param propagation  设置隔离级别
     * @param isolation 设置传播行为
     * @param rollbackFor 设置需要回滚的异常类,默认为RuntimeException
     */
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在类或方法上加上注解并设置其属性

    二、AOP的方式

    • 如图创建一个class,以切面的形式实现事务管理
    // 切面
    @Aspect
    // 表示该类相当于Spring的xml配置文件中的<Beans>
    @Configuration
    public class TransactionAdviceConfig {
    
    	/**
         * 定义切点路径
         */
        private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.personal.test.Satsuki.service.*.*(..))";
    
        @Autowired
        private PlatformTransactionManager transactionManager;
    
    	/**
         * @description 事务管理配置
         */
        @Bean
        public TransactionInterceptor TxAdvice() {
            // 事务管理规则,承载需要进行事务管理的方法名(模糊匹配)及设置的事务管理属性
            NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
    		
    		// 设置第一个事务管理的模式(适用于“增删改”)
    		RuleBasedTransactionAttribute transactionAttribute1 = new RuleBasedTransactionAttribute();
    		// 当抛出设置的对应异常后,进行事务回滚(此处设置为“Exception”级别)
    		transactionAttribute1.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
    		// 设置隔离级别(存在事务则加入其中,不存在则新建事务)
    		transactionAttribute1.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    		// 设置传播行为(读已提交的数据)
    		transactionAttribute1.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    
    		// 设置第二个事务管理的模式(适用于“查”)
    		RuleBasedTransactionAttribute transactionAttribute2 = new RuleBasedTransactionAttribute();
    		// 当抛出设置的对应异常后,进行事务回滚(此处设置为“Exception”级别)
    		transactionAttribute2.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
    		// 设置隔离级别(存在事务则挂起该事务,执行当前逻辑,结束后再恢复上下文事务)
    		transactionAttribute2.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
    		// 设置传播行为(读已提交的数据)
    		transactionAttribute2.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    		// 设置事务是否“只读”(非必需,只是声明该事务中不会进行修改数据库的操作,可减轻由事务造成的数据库压力,属于性能优化的推荐配置)
    		transactionAttribute2.setReadOnly(true);
    		
    		// 建立一个map,用来储存要需要进行事务管理的方法名(模糊匹配)
    		Map<String, TransactionAttribute> txMap = new HashMap<>();
            txMap.put("insert*", transactionAttribute1);
            txMap.put("update*", transactionAttribute1);
            txMap.put("delete*", transactionAttribute1);
            txMap.put("query*", transactionAttribute2);
    
    		// 注入设置好的map
    		source.setNameMap(txMap);
    		// 实例化事务拦截器
            TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
            return txAdvice;
        }
    
    	/**
         * @description 利用AspectJExpressionPointcut设置切面
         */
    	@Bean
        public Advisor txAdviceAdvisor() {
            // 声明切点要切入的面
            AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
            // 设置需要被拦截的路径
            pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
            // 设置切面和配置好的事务管理
            return new DefaultPointcutAdvisor(pointcut, TxAdvice());
        }
    }
    

     

     

  • 相关阅读:
    OpenCR 固件修复
    E-PUCK2机器人-固件更新
    E-puck2机器人系列教程-2.软件的安装与使用
    E-PUCK2机器人-硬件
    E-puck2机器人系列教程-固件修复升级
    GridView
    TimePicker 和TimePickerDiag
    android中实现简单的播放
    ListView的使用
    android的activity的跳转
  • 原文地址:https://www.cnblogs.com/exmyth/p/14301328.html
Copyright © 2011-2022 走看看