微服务中共享数据库的事务管理

时间:2017-11-14 22:14:06

标签: database spring microservices

我有两个使用相同数据库的微服务

  1. 平衡管理的第一次微观化。
  2. 第二次预约管理微观。
  3. 我有以下业务情景:

    1. 需要通过从(Balance Management Microservice)调用REST服务来检查客户端是否有余额。
    2. 如果他有余额,那么我必须调用另一个REST服务来保留余额(Balance Management Microservice)。
    3. 然后我还要通过从(预订管理)调用另一个REST服务来做某种航班预订。
    4. 所以问题是如果步骤3如果在REST服务之间使用事务管理失败,那么如何通过使用相同数据库的所有微服务来回滚步骤2

2 个答案:

答案 0 :(得分:0)

交易是一个工作单位,可以是%100成功,也可以是%0成功。事务由数据库管理和实现,而不是您的应用程序。这就是为什么你可以扩展一个应用程序(创建更多的实例),你的数据保持一致。

同样,许多不同的应用程序可以与同一个数据库通信,这并不重要。假设您正在转移资金,这对应于在同一事务中更新的数据库中的2行。让我们说你做错了,创建2个事务,而不是单独更新每一行。无论您运行1个还是多个应用程序或实例并不重要,如果您在2个交易中执行此操作不正确,那么您可能会面临数据不一致的风险,例如,如果另一个交易从帐户中扣除,而且不再有足够的资金在你的交易之间,那么你可能会得到一个低于0美元的账户,而不是好不好。

另一方面,这需要付出代价。事务是昂贵的,它们需要更多的时间,并且行的更新将不会同时发生,这就是为什么需要扩展到极端性能的系统有时使用仅附加数据库/ NoSQL并依赖于最终的一致性。

答案 1 :(得分:0)

与往常一样,当我们遇到这类问题时,我们应该研究现有的最佳实践。在这种情况下,SAGAs设计模式就是您问题的答案。