0


SpringBoot 开启事务的两种常用方式

前言,有时候统一异常处理不太好,因为范围太广了,很多没必要回滚的地方,因为抛了个异常都没办法继续执行别的代码,所以,可以在需要开事务的地方添加 @Transation 注解开启事务就行了。

springboot 项目中,一般两种方式可以开启事务:

  1. 只需要在类或者方法上添加注解 @Transaction 即可开启事务;
    一般在service类标签上添加@Transactional,这样可以将整个service类纳入spring事务管理(所有的 public 方法纳入),在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。
    在方法上添加这个注解也可以将方法纳入事务(注意事项:@Transactional必须添加在public修饰的方法上)。
  2. 在配置类中使用注解 @EnableTransactionManagement 然后指定开启事务的地方,这样即使不添加注解 @Transactional 也可以在指定地方开启事务。
    如果采用 @EnableTransactionManagement 开启统一的事务控制器,可用代码如下:
    (实例代码详细分析可看这篇好文:https://blog.csdn.net/qq_44211323/article/details/118067155)
@Configuration@EnableTransactionManagementpublicclassTransactionConfig{/**
     * 配置全局事务的切点为service层的所有方法  AOP切面表达式 可参考(https://blog.csdn.net/ycf921244819/article/details/106599489)
     * TODO 设置service层所在位置
     */privatestaticfinalStringAOP_POINTCUT_EXPRESSION="execution (* com.xxx.service..*.*(..))";privatestaticfinalString[]REQUIRED_RULE_TRANSACTION={"insert*","create*","add*","save*","modify*","update*","del*","delete*"};privatestaticfinalString[]READ_RULE_TRANSACTION={"select*","get*","query*","search*","count*","detail*","find*"};/**
     * 注入事务管理器
     */@AutowiredprivateTransactionManager transactionManager;/**
     * 配置事务拦截器
     */@BeanpublicTransactionInterceptortxAdvice(){RuleBasedTransactionAttribute txAttrRequired =newRuleBasedTransactionAttribute();
        txAttrRequired.setName("REQUIRED事务");//设置事务传播机制,默认是PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
        txAttrRequired.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);//设置异常回滚为Exception  默认是RuntimeExceptionList rollbackRuleAttributes =newArrayList<>();
        rollbackRuleAttributes.add(newRollbackRuleAttribute(Exception.class));
        txAttrRequired.setRollbackRules(rollbackRuleAttributes);RuleBasedTransactionAttribute txAttrRequiredReadOnly =newRuleBasedTransactionAttribute();
        txAttrRequiredReadOnly.setName("SUPPORTS事务");//设置事务传播机制,PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
        txAttrRequiredReadOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);//设置异常回滚为Exception  默认是RuntimeException
        txAttrRequiredReadOnly.setRollbackRules(rollbackRuleAttributes);
        txAttrRequiredReadOnly.setReadOnly(true);/*事务管理规则,声明具备事务管理的方法名*/NameMatchTransactionAttributeSource source =newNameMatchTransactionAttributeSource();//方法名规则限制,必须以下列开头才会加入事务管理当中for(String s :REQUIRED_RULE_TRANSACTION){
            source.addTransactionalMethod(s, txAttrRequired);}//对于查询方法,根据实际情况添加事务管理 可能存在查询多个数据时,已查询出来的数据刚好被改变的情况for(String s :READ_RULE_TRANSACTION){
            source.addTransactionalMethod(s, txAttrRequired);}returnnewTransactionInterceptor((PlatformTransactionManager) transactionManager, source);}/**
     *  设置切面
     */@BeanpublicAdvisortxAdviceAdvisor(){AspectJExpressionPointcut pointcut =newAspectJExpressionPointcut();
        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);returnnewDefaultPointcutAdvisor(pointcut,txAdvice());}}

写在最后:
其实两种方式都不需要写 @EnableTransactionManagement 就能使用事务;
为什么SpringBoot中不需要使用@EnableTransactionManagement就能使用事务?
答:因为在SpringBoot中自动装配了此注解配置,所以已被默认启用,自然不需要手动加上此注解。
https://blog.csdn.net/yjrguxing/article/details/113204980)
(简单版:https://blog.csdn.net/m0_51512780/article/details/123241481)

标签: spring boot java spring

本文转载自: https://blog.csdn.net/weixin_44340643/article/details/127491975
版权归原作者 FeiFei Lee 所有, 如有侵权,请联系我们删除。

“SpringBoot 开启事务的两种常用方式”的评论:

还没有评论