【SpringBoot拾遗】1. 事务处理

SpringBoot推荐事务采用@Transactional注解进行配置。使用方式如下:

@Transactional
@Override
public void save() {
    User user = new User("苍老师");
    userMapper.insertSelective(user);
}

全局事务配置:

第一种方式:XML配置;

首先要在启动类配置引入注解:
在这里插入图片描述
然后配置XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="txManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" ></property>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="mod*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="up*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="set*" propagation="REQUIRED"/>
            <tx:method name="change*" propagation="REQUIRED"/>
            <tx:method name="logout*" propagation="REQUIRED"/>
            <tx:method name="login*" propagation="REQUIRED"/>
            <tx:method name="check*" propagation="REQUIRED"/>
            <tx:method name="tiJiao*" propagation="REQUIRED"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="query*" read-only="true"/>
            <tx:method name="init*" read-only="true"/>
            <tx:method name="timing*" propagation="REQUIRED"/>
            <tx:method name="execute*" propagation="REQUIRED"/>
            <tx:method name="execute*" propagation="REQUIRED"/>
            <tx:method name="send*" propagation="REQUIRED"/>
            <tx:method name="batch*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 切入点 -->
        <aop:pointcut id="newServicesPointcut"
                      expression="execution(* com.esl.ce.*.*.service..*.*(..))  or execution (* com.esl.ce.*.*.*.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="newServicesPointcut"/>
    </aop:config>
</beans>

注:切入点一定要和自己项目中的目录结构对应,execution(* com.esl.ce...service….(…)),.*代表一层目录。

第二种方式:java类配置事务

package com.esl.ce.web.common.util;
 
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.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.*;
 
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
 
/**
 * springboot 之 注解式声明事务,使用声明式事务配置
 * @author Administrator
 */
@Configuration
public class ApplicationContextTransactional {
 
    //事务方法超时时间设置
    private static final int TX_METHOD_TIMEOUT=10;
 
    //AOP切面的切点表达式
    private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.esl.ce.*.*.service..*.*(..))  or execution (* com.esl.ce.*.*.*.service..*.*(..))";
 
    //注入事务管理器
    @Autowired
    private PlatformTransactionManager transactionManager;
 
    /**
     * 增强(事务)的属性的配置
     *       isolation:DEFAULT  :事务的隔离级别.
     *       propagation              :事务的传播行为.
     *       read-only                        :false.不是只读
     *       timeout                          :-1
     *       no-rollback-for         :发生哪些异常不回滚
     *       rollback-for                    :发生哪些异常回滚事务
     * @return
     */
    @Bean
    public TransactionInterceptor txAdvice() {
           /*增强(事务)的属性的配置
            * <tx:attributes>
            * */
        NameMatchTransactionAttributeSource txAttributeS = new NameMatchTransactionAttributeSource();
           /*propagation="REQUIRED" , timeout=5 ;rollback-for=".. , .."配置*/
        RuleBasedTransactionAttribute requiredAttr = new RuleBasedTransactionAttribute();
        requiredAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        requiredAttr.setTimeout(TX_METHOD_TIMEOUT);
        requiredAttr.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
           /*propagation="SUPPORTS" , readOnly="true"配置*/
        RuleBasedTransactionAttribute supportsAttr = new RuleBasedTransactionAttribute();
        supportsAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
        supportsAttr.setReadOnly(true);
           /*
            注意:方法名称来自类匹配的到方法【save*, “*”表示匹配任意個字符】
             <tx:method .../>
            */
        Map<String , TransactionAttribute> txMethod = new HashMap<String , TransactionAttribute>();
        txMethod.put("add*" , requiredAttr);
        txMethod.put("save*" , requiredAttr);
        txMethod.put("del*" , requiredAttr);
        txMethod.put("mod*" , requiredAttr);
        txMethod.put("update*" , requiredAttr);
        txMethod.put("up*" , requiredAttr);
        txMethod.put("remove*" , requiredAttr);
        txMethod.put("set*" , requiredAttr);
        txMethod.put("change*" , requiredAttr);
        txMethod.put("logout*" , requiredAttr);
        txMethod.put("login*" , requiredAttr);
        txMethod.put("check*" , requiredAttr);
        txMethod.put("tiJiao*" , requiredAttr);
        txMethod.put("get*" , supportsAttr);
        txMethod.put("find*" , supportsAttr);
        txMethod.put("query*" , supportsAttr);
        txMethod.put("init*" , supportsAttr);
        txMethod.put("timing*" , requiredAttr);
        txMethod.put("execute*" , requiredAttr);
        txMethod.put("execute*" , requiredAttr);
        txMethod.put("send*" , requiredAttr);
        txMethod.put("batch*" , requiredAttr);
        txAttributeS.setNameMap(txMethod);
        TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager , txAttributeS);
        return txAdvice;
    }
 
    /**
     * AOP配置定义切面和切点的信息
     * @return
     */
    @Bean
    public Advisor txAdviceAdvisor() {
        AspectJExpressionPointcut pointcut= new AspectJExpressionPointcut();
        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut , txAdvice());
    }
 
}

————————————————
版权声明:本文为CSDN博主「衹染青春」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40717107/article/details/99852981

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:上身试试 返回首页