SpringBoot 开启事务的常用方式

这篇具有很好参考价值的文章主要介绍了SpringBoot 开启事务的常用方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

springboot 项目中,一般两种方式可以开启事务:
1. 只需要在类或者方法上添加注解 @Transaction 即可开启事务;
一般在service类标签上添加@Transactional,这样可以将整个service类纳入spring事务管理(所有的 public 方法纳入),在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。
在方法上添加这个注解也可以将方法纳入事务(注意事项:@Transactional必须添加在public修饰的方法上)。
2. 在配置类中使用注解 @EnableTransactionManagement 然后指定开启事务的地方,这样即使不添加注解 @Transactional 也可以在指定地方开启事务。
如果采用 @EnableTransactionManagement 开启统一的事务控制器,可用代码如下:
 

@Configuration
@EnableTransactionManagement
public class TransactionConfig {
    /**
     * 配置全局事务的切点为service层的所有方法  AOP切面表达式 可参考(https://blog.csdn.net/ycf921244819/article/details/106599489)
     * TODO 设置service层所在位置
     */
    private static final String AOP_POINTCUT_EXPRESSION = "execution (* com.xxx.service..*.*(..))";
    private static final String[] REQUIRED_RULE_TRANSACTION = {"insert*", "create*", "add*", "save*","modify*", "update*", "del*", "delete*"};
    private static final String[] READ_RULE_TRANSACTION = {"select*", "get*", "query*", "search*", "count*","detail*", "find*"};
    /**
     * 注入事务管理器
     */
    @Autowired
    private TransactionManager transactionManager;
    /**
     * 配置事务拦截器
     */
    @Bean
    public TransactionInterceptor txAdvice() {

        RuleBasedTransactionAttribute txAttrRequired = new RuleBasedTransactionAttribute();
        txAttrRequired.setName("REQUIRED事务");
        //设置事务传播机制,默认是PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
        txAttrRequired.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        //设置异常回滚为Exception  默认是RuntimeException
        List rollbackRuleAttributes = new ArrayList<>();
        rollbackRuleAttributes.add(new RollbackRuleAttribute(Exception.class));
        txAttrRequired.setRollbackRules(rollbackRuleAttributes);

        RuleBasedTransactionAttribute txAttrRequiredReadOnly = new RuleBasedTransactionAttribute();
        txAttrRequiredReadOnly.setName("SUPPORTS事务");
        //设置事务传播机制,PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
        txAttrRequiredReadOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
        //设置异常回滚为Exception  默认是RuntimeException
        txAttrRequiredReadOnly.setRollbackRules(rollbackRuleAttributes);
        txAttrRequiredReadOnly.setReadOnly(true);
        /*事务管理规则,声明具备事务管理的方法名*/
        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
        //方法名规则限制,必须以下列开头才会加入事务管理当中
        for (String s : REQUIRED_RULE_TRANSACTION) {
            source.addTransactionalMethod(s, txAttrRequired);
        }
        //对于查询方法,根据实际情况添加事务管理 可能存在查询多个数据时,已查询出来的数据刚好被改变的情况
        for (String s : READ_RULE_TRANSACTION) {
            source.addTransactionalMethod(s, txAttrRequired);
        }
        return new TransactionInterceptor((PlatformTransactionManager) transactionManager, source);
    }
    /**
     *  设置切面
     */
    @Bean
    public Advisor txAdviceAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut, txAdvice());
    }
}

写在最后:
其实两种方式都不需要写 @EnableTransactionManagement 就能使用事务;
为什么SpringBoot中不需要使用@EnableTransactionManagement就能使用事务?
答:因为在SpringBoot中自动装配了此注解配置,所以已被默认启用,自然不需要手动加上此注解。
 文章来源地址https://www.toymoban.com/news/detail-568582.html

到了这里,关于SpringBoot 开启事务的常用方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 04 SpringBoot整合Druid/MyBatis/事务/AOP+打包项目

    项目结构: 引入依赖: 启动类: 实体类: Controller类: Druid配置文件application.yaml : 启动项目后进入8080/user/getUser即可获得返回的json. 先看看总体的步骤: 导入依赖:在pom.xml中添加MyBatis和数据库驱动的相关依赖。 配置数据源: application.yml 中配置 数据库连接信息,包括数据

    2024年01月21日
    浏览(41)
  • 解决多数据源的事务问题 - 基于springboot--mybatis

    在Spring Boot和MyBatis中,我们有时需要在方法中同时使用两个不同的数据库,但使用 @Transactional 注解会变得复杂。这时我们可以用一种更灵活的方法来处理。 想象一下这样的场景:我们有两个数据库,我们希望在一个方法中同时操作它们,但是普通的 @Transactional 注解变得不太

    2024年02月01日
    浏览(44)
  • Springboot 大事务问题的常用优化方案

    🏷️ 个人主页 :牵着猫散步的鼠鼠  🏷️ 系列专栏 :Java全栈-专栏 🏷️ 个人学习笔记,若有缺误,欢迎评论区指正 目录 1.前言 2.什么是大事务 3.解决办法 3.1.少用@Transactional注解 3.2..将查询(select)方法放到事务外 3.3事务中避免远程调用 3.4事务中避免一次性处理太多数据

    2024年04月13日
    浏览(29)
  • SpringBoot第24讲:SpringBoot集成MySQL - MyBatis XML方式

    上文介绍了用JPA方式的集成MySQL数据库,JPA方式在中国以外地区开发而言基本是标配, 在国内MyBatis及其延伸框架较为主流 。本文是SpringBoot第24讲,主要介绍 MyBatis技栈的演化 以及 SpringBoot集成基础的MyBatis XML实现方式 的实例。

    2024年02月15日
    浏览(39)
  • 【业务功能篇52】Springboot+mybatis mysql开启批量执行sql参数 allowMultiQueries=true

    可以在sql语句后携带分号,实现多语句执行。 可以执行批处理,同时发出多个SQL语句。 在application-xxx.xml配置文件中,配置数据库的信息  实例 dao层xml: 逐条更新,但一次提交给MySQL服务器而已。 利用foreach 遍历循环,传入的list集合数据,批量的进行update   MySQL的JDBC连接的

    2024年02月15日
    浏览(46)
  • for循环中循环一次提交一次 insert update 关闭事务 spring springboot mybatis

     在方法上直接加如下注解: 在测试的时候,有时候会希望在for循环中,代码循环一次就提交一次事务。 最简单的方式,就是关闭事务,不需要事务。添加注解如下: 如果说是真的在生产上有这样的需要,每循环一次就提交事务,那就需要手动控制事务了。 需要这几行代码

    2024年02月07日
    浏览(47)
  • SpringBoot项目中控制线程池、多线程事务提交、回滚的方式

    场景: 1、由于多线程每个线程都是一个异步任务,所以每个线程都是一个单独的事务,通常使用的声明式事务 @Transactional() 是无法控制多线程中事务的 2、所以只能另寻解决方式 解决: 一、基于TransactionStatus集合来控制多线程事务提交(推荐此方式) 1、代码案例

    2024年02月15日
    浏览(51)
  • Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务

    背景 处理多数据源事务一直是一个复杂而棘手的问题,通常我们有两种主流的解决方法。 第一种是通过Atomikos手动创建多数据源事务,这种方法更适合数据源数量较少,参数配置不复杂,对性能要求不高的项目。然而,这种方法的最大困难在于需要手动配置大量设置,这可能

    2024年02月11日
    浏览(40)
  • SpringBoot集成MyBatis-yml方式详解

            简介:spring boot整合mybatis开发web系统目前来说是市面上主流的框架,每个Java程序和springboot mybatis相处的时间可谓是比和自己女朋友相处的时间都多,但是springboot mybatis并没有得到你的真爱,因为你只是为了养活你女朋友而委曲求全的和spring boot mybatis假意相处。和

    2023年04月21日
    浏览(36)
  • SpringBoot+MyBatis批量插入数据的三种方式

    最近导入表格数据时需要同时插入修改大量数据,研究了一下有三种实现方式 1、用for循环调用sql插入数据 这种方式插入大量数据时,效率非常底下,不推荐 2、利用mybatis的foreach来实现循环插入 这种方式插入大量数据时,好处是不用频繁访问数据库,一条sql搞定,效率比较

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包