1、问题场景:@Transactional注解的方法中,发送了一个队列执行耗时操作,在队列消费执行查询操作时,事务还没有提交完成,导致幻读。
@Transactional
public void update(Object obj) {
// 执行update相关逻辑
updatePlan(obj);
// 发送队列,执行耗时操作
sendMQ(obj.getId());
}
@StreamListener("plan")
public void (Long id) {
// 查询plan,但此时事务未提交
selectPlan(id);
}
2、解决方法,给事务方法增加一个适配器,监听事务提交后再发送队列
@Transactional
public void update(Object obj) {
// 执行update相关逻辑
updatePlan(obj);
// 事务提交完毕后再触发
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
// 发送队列,执行耗时操作
sendMQ(obj.getId());
}
}
});
}