美文网首页
编程式事务(手动事务)-TransactionTemplate

编程式事务(手动事务)-TransactionTemplate

作者: AC编程 | 来源:发表于2022-11-09 18:45 被阅读0次

    一、代码

    @Slf4j
    public class Test {
        @Resource
        private TransactionTemplate template;
    
        private void func() {
            template.execute((TransactionCallback<Object>) transactionStatus -> {
                try {
                    //保存报名信息
                    super.save(activityAttend);
    
                    //存快照信息
                    activitySnapshotService.save(activityAttend.getId(), dynamicDetail);
                    return true;
    
                } catch (Exception e) {
                    transactionStatus.setRollbackOnly();
                    throw new Exception("事务提交失败");
                }
            });
        }
    }
    

    其实TransactionTemplate不需要try catch手动回滚,如果代码块里出现异常,TransactionTemplate会自动帮我们回滚(亲测),可以简写成如下:

    @Slf4j
    public class Test {
        @Resource
        private TransactionTemplate template;
    
        private void func() {
            template.execute((TransactionCallback<Object>) transactionStatus -> {
                 //保存报名信息
                    super.save(activityAttend);
    
                    //存快照信息
                    activitySnapshotService.save(activityAttend.getId(), dynamicDetail);
                    return true;
            });
        }
    }
    

    注意:方法上,不要写@Transactional 事务注解

    二、使用场景

    2.1 MQ

    如果在@Transactional 事务注解的方法里,新增/修改了数据,然后发MQ,其他地方要取刚才操作的数据,就存在时差问题,消费MQ的地方取到的是旧数据。

    2.2 调用第三方接口

    当调用第三方接口时,如果第三方接口返回很慢,则@Transactional方法里的事务就需要等很久才能提交,这样容易消耗数据库的连接数,甚至出现数据库连接数耗尽的情况。

    相关文章

      网友评论

          本文标题:编程式事务(手动事务)-TransactionTemplate

          本文链接:https://www.haomeiwen.com/subject/jujatdtx.html