spring boot通过Java Bean配置来开启事务

本文介绍了如何通过@Transactional注解、声明式事务管理以及JavaBean配置,详细讲解了不同场景下事务的开启、配置规则,并列举了事务传播策略和只读事务的应用。此外,还提供了Spring AOP自动代理配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用的开启事务方式

  1. 注解的方式,通过@Transactional,直接注释在方法上,然后可以通过参数来配置。
  2. 声明的方式,在需要回滚的代码前加上开启,最后加关闭。
@Autowired
private PlatformTransactionManager transactionManager;

// 开启事务
TransactionStatus status = transactionManager
                .getTransaction(new DefaultTransactionDefinition());



// 业务代码......


// 提交事务
transactionManager.commit(status);

// 异常时 回滚
transactionManager.rollback(status);
  1. 通过Java Bean代码配置的方式,来全局控制方法名来控制事务,通过方法名的前缀来使用事务,比如简单的get,find这类的是简单的查询,我们就用只读事务,如 add,update 开头的方法,我们用传播事务,还有一些特殊的,可以直接通过
    source.addTransactionalMethod(“action*”, required);
    来添加。
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
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;

@Configuration
// 包扫描的位置,指的是我们的mybatis或者mybatis-plus生成的Dao层
@MapperScan(basePackages = "com.xxx.xxx.mapper.*")
public class TransactionConfig {


    public static final String[] REQUIRED_READONLY = new String[]{"find*", "get*", "select*", "list*", "search*", "query*", "count*", "look*", "is*"};
    public static final String[] REQUIRED = new String[]{"add*", "new*", "insert*", "create*", "save*", "edit*", "modify*", "update*", "set*", "exchange*", "exec*", "execute*", "delete*", "handle*", "batch*", "bind*", "gain*", "unload*", "invalid*", "liquidation*", "cancle*", "rollback*", "build*", "draw*", "reward*", "accept*", "complete*", "send*", "give*", "push*", "put*"};


    @Bean(name = "txAdvice")
    @Primary
    public TransactionInterceptor txAdvice(TransactionManager transactionManager) {
        /*************************** 传播事务 ********************/
        //  定义回滚时的运行异常
        RuleBasedTransactionAttribute required = new RuleBasedTransactionAttribute();
        required.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
        // 事务传播采用的 required
        required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 事务的超时时间 这边采用的是默认时间
        required.setTimeout(TransactionDefinition.TIMEOUT_DEFAULT);

        /*************************** 只读事务 ********************/
        RuleBasedTransactionAttribute readOnly = new RuleBasedTransactionAttribute();
        readOnly.setReadOnly(true);
        readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);

        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();

        // 默认的只读事务配置
        for (String methodName : REQUIRED_READONLY) {
            source.addTransactionalMethod(methodName, readOnly);
        }

        // 默认的传播事务配置
        for (String methodName : REQUIRED) {
            source.addTransactionalMethod(methodName, required);
        }

        // 业务
        source.addTransactionalMethod("action*", required);

        return new TransactionInterceptor(transactionManager, source);
    }

    @Bean
    @Primary
    public BeanNameAutoProxyCreator txProxy() {
        BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
        // 开启事务的 类名结尾字符定义
        creator.setInterceptorNames("txAdvice");
        // 指定了所有的service 可以根据自己指定的service来开启
        creator.setBeanNames("*Service", "*ServiceImpl");
        creator.setProxyTargetClass(true);
        return creator;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值