美文网首页
TransactionTemplate事务失效问题

TransactionTemplate事务失效问题

作者: AC编程 | 来源:发表于2023-04-02 16:07 被阅读0次

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

二、TransactionTemplate事务失效-延时提交了

用了TransactionTemplate之后,是不能再用@Transactional的,但由于某种原因,TransactionTemplate不小心被@Transactional包裹了,导致出现了一些业务BUG,伪代码如下:

@Slf4j
public class Test {
    @Resource
    private TransactionTemplate template;

    //不小心被@Transactional
    @Transactional
   private void doxxlJob(){
       func();
   }

    private void func() {
        template.execute((TransactionCallback<Object>) transactionStatus -> {
             //保存报名信息
                super.save(activityAttend);

                //存快照信息
                activitySnapshotService.save(activityAttend.getId(), dynamicDetail);
                return true;
        });

       System.out.println("TransactionTemplate还没提交,就执行该代码了");
    }
}

BUG定位重要提醒:有的时候func(),不只在一个地方被调用,在case1中是没被@Transactional包裹的,可能在case2中就被包裹了。

三、其他说明

ransactionTemplate在执行事务时,会根据事务的传播属性和隔离级别等参数来选择合适的事务管理器,并在事务回调执行完毕后自动提交事务。因此,如果TransactionTemplate的事务延时提交,可能是由以下原因导致的:

事务传播属性设置错误:事务传播属性用于控制事务的传播行为,如何处理在嵌套的方法调用中多个事务之间的关系。如果在调用嵌套方法时设置了错误的事务传播属性,可能会导致事务延时提交或不提交。

异步调用:如果在事务回调中使用了异步调用,例如使用@Async注解或是使用线程池进行异步处理,可能会导致事务延时提交或不提交。

事务管理器设置错误:如果在使用TransactionTemplate时,选择了错误的事务管理器,可能会导致事务延时提交或不提交。

为了避免TransactionTemplate的事务延时提交,我们需要仔细检查事务传播属性、异步调用和事务管理器等方面的设置,确保事务能够正确地执行并保持数据的一致性。同时,我们还可以通过日志记录、调试等方式来定位和解决事务延时提交的问题。若确实是存在延时提交的情况,也可以考虑手动提交事务来解决问题。

相关文章

网友评论

      本文标题:TransactionTemplate事务失效问题

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