【问题标题】:@transactional in service class with microservices带有微服务的服务类中的@transactional
【发布时间】:2021-04-20 01:53:57
【问题描述】:

我在微服务下工作并使用@transactional,遇到了一个疑问,假设我已经在服务类上编写了@transactional,该服务类在内部为数据库操作调用了不同的微服务。现在假设其中一个微服务失败了,其他微服务的数据库状态会发生什么,因为它们已经提交了他们的数据库,或者如何回滚?

示例代码如下

@Transactional
@Service
class MySerivce{
    public void method(){
        // call microservice1
        // call microservice 2 (fails or give error)
    }
}

请分享知识。 谢谢!

【问题讨论】:

    标签: spring spring-boot microservices spring-transactions


    【解决方案1】:

    这两个微服务和您的应用程序是独立的系统。 @Transactional 仅管理应用程序本地的事务。它不知道如何管理它调用的其他微服务的事务(同样不可能这样做,否则你最终会像黑客一样破解其他微服务..)

    因此,如果 microservice2 失败,回滚所有已经在 microservice1 上完成的事情将无济于事。您必须手动处理它。 Microservice1 需要提供 API 来撤销这样的事情,然后您需要手动捕获 microservice1 抛出的异常并调用该 API 来应用补偿动作。

    一种称为 saga 模式的模式旨在解决此类问题。你可以google一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2021-03-27
      • 2020-07-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多