@Transactional事务方法中调用队列执行耗时操作导致幻读问题

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());
                }
            }
        });
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容