什么是分布式事务?
当使用微服务时,它可能会破坏事务。这意味着单体系统中的本地事务现在分布到多个服务中,这些服务将按顺序调用。
这是一个使用本地事务的单体系统的客户订单示例:
在上面的客户订单示例中,如果用户将Put Order操作发送到单体系统,系统将创建一个本地数据库事务,该事务适用于多个数据库表。如果任何步骤失败,事务可以回滚。
当为微服务架构时,创建了CustomerMicroservice和OrderMicroservice,它们有单独的数据库。以下是一个带有微服务的客户订单示例:
在单体应用程序中,我们有数据库系统来确保执行动作的事务性,但问题是在微服务应用程序的情况下如何确保事务?
在此模型中,典型的业务操作由一系列单独的步骤组成。在执行这些步骤时,系统状态可能会不一致,当所有操作完成并且所有步骤都已执行时,结果将是一致的。所以在微服务中需要实现最终的一致性。
最终一致性模型中的一个挑战是如何处理失败的步骤。在这种情况下,可能需要撤消操作中先前步骤完成的所有工作。但是,不能简单地回滚数据,因为应用程序的其他操作可能已经更改了它。即使在并发实例没有更改数据的情况下,撤消步骤也可能不仅仅是恢复初始状态的那么简单。
解决方案 :
解决方案是实施补偿交易。补偿事务可能无法简单地将当前状态替换为系统在操作开始时所处的状态,因为这种方法可能会覆盖应用程序的其他并发操作所做的更改。相反,它必须是一个针对场景个性化的过程。
使用SAGA设计模式可以实现补偿事务。
Saga 模式是另一种广泛使用的分布式事务模式。它不同于2pc是同步的,Saga 模式是异步,在 Saga 模式中,分布式事务由所有相关微服务上的异步本地事务完成。
这是客户订单示例的 Saga 模式图:
在上面的示例中,OrderMicroservice接收到下订单的请求。它首先启动本地事务以创建订单,然后发出OrderCreated事件。CustomerMicroservice监听此事件并在收到事件后更新客户资金。如果成功从资金中扣除,CustomerFundUpdated则会发出一个事件,在本例中意味着交易结束。
如果微服务未能完成其本地事务,其他微服务将运行补偿事务以回滚更改。这是补偿交易的 Saga 模式图:
在上面的示例中,由于UpdateCustomerFund某种原因失败,然后它发出了一个CustomerFundUpdateFailed事件。监听事件并启动其OrderMicroservice补偿事务以恢复创建的订单。




