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;
                }
            }
        });
    }

控制台打印
在这里插入图片描述

简单源码分析

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

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);// 回滚
        }
    }

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

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

所以推荐使用TransactionTemplate

应用场景

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

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

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

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

所以还是要灵活组合使用。不能全部都是声明式事务,可以适当的使用一些编程式事务。当项目中有些奇葩操作出现时,编程式事务就有用武之地了。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot中,可以使用编程事务来管理事务操作。编程事务可以通过使用TransactionManager和TransactionStatus来实现。首先,需要引入相关类,如PlatformTransactionManager和TransactionDefinition。然后,通过@Autowired注入事务管理器对象。接下来,可以使用DefaultTransactionDefinition来定义事务的属性,如传播行为。然后,使用transactionManager.getTransaction方法来获取事务的状态。在事务中,可以执行需要进行事务管理的操作。最后,通过transactionManager.commit方法来提交事务,或者通过transactionManager.rollback方法来回滚事务编程事务的一个例子如下所示: ```java TransactionManager transactionManager = new TransactionManager(); TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { // 执行需要进行事务管理的操作 // ... transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); e.printStackTrace(); } ``` 这样,就可以使用编程事务来管理SpringBoot中的事务操作了。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [springboot 编程事务](https://blog.csdn.net/fzy629442466/article/details/103458630)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SpringBoot编程事务](https://blog.csdn.net/u014163312/article/details/120211350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值