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