首页 > 解决方案 > 在Spring Boot中使用@transactional注释控制方法中的执行顺序

问题描述

我有一个类似的方法:

@Component
class test{

    @Autowire
    private MongoService mongo;
    @Autowire
    private KafkaMessageService kafka;

    @Transactional
    public void method(){
    
    mongo.save(model); //saves data in mongo
    kafka.send(message); //sends kafka message
    }
 }

因此,在这种情况下,我有一个要求,即当事务成功时(无异常),应首先提交mongo.save(model) ,然后只发布一条 Kafka 消息,但有时观察到首先发送 Kafka 消息,然后是 Mongo 中的提交,我需要更新的 mongo 数据在服务中发布 Kafka 消息,否则它将是脏读。

有没有办法在@Transactional 中序列化这些内部方法调用?如果两个失败中的任何一个失败,我也需要回滚

我的疯狂猜测是,当事务完成时,这两种方法都在并行线程中运行,或者在 mongo 中提交可能比发布消息花费更多时间。

标签: javamongodbspring-bootapache-kafkatransactions

解决方案


推荐阅读