Springboot 编程式事务

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

spring-boot 2.5.3版本
msyql

SpringBoot编程式事务,可以使用2种方式。

Spring模板方式调用TransactionTemplate

默认TransactionAutoConfiguration自动装配。使用时直接注入TransactionTemplate 使用
推荐使用
编写一个测试类,简单测试一下,测试一下异常报错,手动设置回滚状态。

   @Autowired
   private TransactionTemplate transactionTemplate;
   
    @Test
    void templateTest()  {
        Object execute = transactionTemplate.execute(new TransactionCallback() {
            /**
             * @param transactionStatus 事务运行状态信息 是否是新事务、是否已被标记为回滚等
             * @return
             */
            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {
                Object result;
                try {
                    log.info("执行事务方法");
                    TerminalUserConfig ter = new TerminalUserConfig();
                    ter.setId(RandomUtil.randomLong());
                    ter.setConfigKey(RandomUtil.randomString(5));
                    ter.setConfigValue(RandomUtil.randomString(5));
                    ter.setUserId(1L);
                    result = terminalUserConfigMapper.insertTerminalUserConfig(ter);
                    // 手动设置异常
                    int i = 1 / 0;
                    log.info("正常执行完成");
                    return result;
                } catch (Exception exception) {
                    log.info("执行事务异常,需要回滚");
                    transactionStatus.setRollbackOnly();
                    return false;
                }
            }
        });
    }

控制台打印
springboot 编程式事务,java,spring boot,java,spring

简单源码分析

spring提供了TransactionCallback和子类TransactionCallbackWithoutResult。
TransactionCallback默认是带返回值的,子类实现则不带。可以根据实际情况来决定是否需要返回值。
springboot 编程式事务,java,spring boot,java,spring
查看TransactionTemplate的execute方法可以知道。默认doInTransaction方法是不需要手动设置回滚状态,只要有异常就会自动回滚。
但是手动设置回滚也是可以,AbstractPlatformTransactionManager会在commit方法中判断事务的状态,然后决定提交还是回滚。
springboot 编程式事务,java,spring boot,java,spring
所以至于是否要捕获异常,可以自行决定。既然已经封装了异常捕获回滚,建议还是抛异常即可。

Spring原始方式PlatformTransactionManager

PlatformTransactionManager核心事务管理器 ,用来管理事务,包含事务的提交,回滚。
TransactionDefinition 事务基础信息 超时时间、隔离级别、传播属性等
TransactionStatus 事务状态

	@Test
    void manageTest()  {
        //事务基础信息 超时时间、隔离级别、传播属性等
        DefaultTransactionDefinition transDef = new DefaultTransactionDefinition(); // 定义事务属性
        // 设置传播行为属性, 默认事务级别。 当前无事务则新建事务,已有事务则加入事务。
        transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
        // 获得事务状态
        TransactionStatus status = transactionManager.getTransaction(transDef); 
        try {
            log.info("执行事务方法");
            TerminalUserConfig ter = new TerminalUserConfig();
            ter.setId(RandomUtil.randomLong());
            ter.setConfigKey(RandomUtil.randomString(5));
            ter.setConfigValue(RandomUtil.randomString(5));
            ter.setUserId(1L);
            // 数据库操作
            terminalUserConfigMapper.insertTerminalUserConfig(ter);
            //手动设置异常
            int i = 1 / 0;
            transactionManager.commit(status);// 提交
        } catch (Exception e) {
            log.info("执行事务异常,需要回滚");
            transactionManager.rollback(status);// 回滚
        }
    }

控制台打印
springboot 编程式事务,java,spring boot,java,spring
方法需要实施事务管理,我们首先需要在方法开始执行前启动一个事务,调用PlatformTransactionManager.getTransaction(…) 方法便可启动一个事务。创建并启动了事务之后,便可以开始编写业务逻辑代码,然后在适当的地方执行事务的提交或者回滚。

很明显这样原始的方式,事务管理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且每一个业务方法都包含了类似的启动事务、提交/回滚事务的模板代码。也可以简单封装成工具类去调用。

所以推荐使用TransactionTemplate

应用场景

在声明式事务流行的当下,编程式事务很少在项目中出现。
编程式事务最大的优点就是灵活可控,缺点就是要手写要规范且麻烦。

  • 灵活控制复杂业务流程
  • 大事务拆分

声明式事务的最小粒度要作用在方法
一个方法被事务嵌套,那么就可能会在方法中加入一些如RPC远程调用、消息发送、缓存更新、文件写入等操作。
接口会因为处理超长而容易超时,引发调用方事务回滚或者方法内某些业务操作无法自动回滚

大事务的拆分,可以拆分成多个小事务,通过编程式事务来解决。

所以还是要灵活组合使用。不能全部都是声明式事务,可以适当的使用一些编程式事务。当项目中有些奇葩操作出现时,编程式事务就有用武之地了。文章来源地址https://www.toymoban.com/news/detail-677487.html

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

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

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

相关文章

  • Redis(发布订阅、事务、redis整合springboot、集成 Spring Cache)

    目录 一.redis的发布订阅 1、什么 是发布和订阅 2、Redis的发布和订阅 3、发布订阅的代码实现 二.Redis事务 1.事务简介 1、在事务执行之前 如果监听的key的值有变化就不能执行 2、在事务执行之前 如果监听的key的值没有变化就能执行 3、Exec之前就出现错误 4、Exec之后出现的错误

    2024年01月24日
    浏览(49)
  • transaction 事务 开启 关闭 不使用 手动控制 spring springboot mybatis

    spring springboot mybatis 事务配置 Transactional的Propagation 开启事务 关闭事务_globalcoding 单元测试时,发现默认是使用事务。想要关闭事务,使用: 做单元测试的时候,发现默认是使用事务的。代码和日志如下: 日志: 通过日志发现,默认用了事务transaction,这会有一个现象,就是

    2024年02月03日
    浏览(42)
  • 【Spring Boot】SpringBoot 单元测试

    单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 1、可以⾮常简单、直观、快速的测试某⼀个功能是否正确。 2、使⽤单元测试可以帮我们在打包的时候,发现⼀些问题,因为在打包之前,所以的单元测试必须通过,否则不能打包

    2024年02月07日
    浏览(52)
  • SpringBoot整理-Spring Boot配置

    Spring Boot 的配置系统是其核心功能之一,旨在简化 Spring 应用的配置过程。Spring Boot 提供了一种灵活的方式来配置你的应用,无论是通过外部配置文件,环境变量,命令行参数还是在代码中直接配置。以下是关于 Spring Boot 配置的几个重要方面: 配置文件 application.prop

    2024年01月25日
    浏览(51)
  • SpringBoot教程(一)|认识Spring Boot

    安得广厦千万间,大庇天下寒士俱欢颜,风雨不动安如山,呜呼,何时眼前突兀见此屋,吾庐独破受冻死亦足! Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需

    2024年01月16日
    浏览(48)
  • 【Spring Boot】Spring Boot项目中如何查看springBoot版本和Spring的版本

    在项目中查看默认版本有两种方式如下 Spring Boot 的最新版本支持情况: 版本 发布时间 停止维护时间 停止商业支持 3.0.x 2022-11-24 2023-11-24 2025-02-24 2.7.x 2022-05-19 2023-11-18 2025-02-18 2.6.x 2021-12-17 2022-11-24 2024-02-24 2.5.x 2021-05-20 已停止 2023-08-24 2.4.x 2020-11-12 已停止 2023-02-23 2.3.x 2020-05-

    2024年02月11日
    浏览(97)
  • SpringBoot教程(三) | Spring Boot初体验

    上篇文章我们创建了SpringBoot 项目,并且进行了简单的启动。整个项目了里其实我们就动了两个文件,一个是pom.xml负责管理springboot的相关依赖,一个是springBoot的启动类。 pom文件中通过starter的形式大大简化了配置,不像以前一样需要引入大量的依赖配置,搞不好还得解决冲突

    2024年01月16日
    浏览(48)
  • SpringBoot整理-Spring Boot与Spring MVC的区别

    Spring Boot 和 Spring MVC 是 Spring 框架的两个不同部分,它们在 Java Web 开发中扮演着各自独特的角色。理解它们之间的区别有助于更好地利用 Spring 生态系统进行有效的应用开发。 Spring MVC 定义:  Spring MVC 是基于 Model-View-Controller(模型-视图-控制器)设计模式的一个 

    2024年01月22日
    浏览(44)
  • 【SpringBoot】详细介绍Spring Boot中@Component

    在Spring Boot中,`@Component`是一个通用的注解,用于标识一个类是Spring框架中的组件。`@Component`注解是Spring的核心注解之一,它提供了自动扫描和实例化bean的功能。 具体来说, `@Component`注解的作用是将一个普通的Java类转化为Spring的组件。通过`@Component`注解标记的类会被Spring框

    2024年02月11日
    浏览(35)
  • Springboot 实践(13)spring boot 整合RabbitMq

    前文讲解了RabbitMQ的下载和安装,此文讲解springboot整合RabbitMq实现消息的发送和消费。 1、创建web project项目,名称为“SpringbootAction-RabbitMQ” 2、修改pom.xml文件,添加amqp使用jar包    !--  RabbitMQ --         dependency             groupIdorg.springframework.boot/groupId         

    2024年02月09日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包