当前位置: 首页 > 知识库问答 >
问题:

跨许多微服务的2PC分布式事务?

曹自怡
2023-03-14

我知道最好使用 Saga 模式,但想想还是很有趣的:

    < Li > 2PC/XA分布式事务是否提供了仅从一个应用程序和一个TM与多个RM进行事务的可能性? < li >如果没有-如果每个微服务只能访问自己的数据库,如何在多个微服务之间使用2PC/XA分布式事务来提供使用2PC的能力?我很乐意看到一个例子 < li >我们是否需要将TransactionManager服务作为一个独立的微服务,在多个微服务之间提供2PC?

更新:在JTA世界中,<code>TransactionManager</code>不提供REST API来管理跨微服务的事务。LIXA提供了这种能力。除答案外,还附有示例的文章:)

共有1个答案

常明亮
2023-03-14

跨微服务,需要通过公开 Prepare 来完成事务

例如,假设有 2 家不同的银行,银行 1 Account_A的 100 美元必须转入银行 2 的Account_B。此外,假设中央银行当局负责交易以完成2PC的工作方式如下:

>

  • 中央银行机构(交易经理)将收到从银行1的Account_A向银行2的Account_B转账100美元的请求

    a. https://CentralBank/Transaction?from=Bank1-Account_A&to=Bank2-Account_B&amount=100
    

    中央银行会将其保存到其交易数据库中,交易id=123。它还将返回要调用的交易id,以便稍后它可以调用以获取交易状态。

    a. add transaction 123 in database with status open
    

    PREPARE PHASE事务管理器将发出以下RPC命令:

    a. https://Bank1/Prepare?Account=Account_A&money=100&action=subtract&transactionid=123
    b. https://Bank2/Prepare?Account=Account_B&money=100&action=add&transactionid=123
    

    提交阶段 一旦它在准备阶段获得两个调用的成功响应,它就会进入提交阶段,在该阶段发出以下命令:

    a. move transaction 123 to committed state
    b. https://Bank1/Commit?transactionid=123
    c. https://Bank2/Commit?transactionid=123
    

    一旦在提交阶段对两个调用都获得成功响应,中央银行就可以将交易移动到已完成状态(可选)

    如果准备或提交阶段的任何步骤失败,则事务协调器通过发出以下命令中止事务

    a. move transaction 123 to Failed state
    b. https://Bank1/Rollback?transactionid=123
    c. https://Bank2/Rollback?transactionid=123
    

    上面的问题是分布式原子提交的形式,2PC是一种方法。还要注意2PC有很多缺点,比如如果在准备阶段中央银行崩溃后怎么办。还有,如果4. c步骤失败,但4.b成功了,等等。讨论这些本身就是非常广泛的研究,但仍然是需要注意的事情。尽管有很多缺点,2PC因其简单性而被广泛使用。

    我们是否需要将TransactionManager服务作为一个单独的微服务来提供多个微服务之间的2PC?

    理论上没有。如果您仔细观察任何银行(Bank1或Bank2)也可以充当事务管理器(它只需要一个单独的数据库表Transact),但实际上很多时候它都作为单独的微服务保留。

  •  类似资料:
    • 我正在发展我对分布式系统的见解,以及如何在这样的系统中保持数据一致性,其中业务事务涵盖多种服务、有限的上下文和网络边界。 我知道有两种方法用于实现分布式事务: 2阶段提交(2PC) 萨加斯 2PC 是一种协议,供应用程序通过平台支持透明地利用全局 ACID 事务。据我所知,它嵌入在平台中,对业务逻辑和应用程序代码是透明的。 另一方面,Sagas是一系列本地事务,其中每个本地事务都会发生变化,并保存

    • 我有两个微服务和调用来更新数据,然后插入另一个数据,但让我们考虑一下 失败,然后我们需要回滚由 更新的数据,否则我们将处于不一致的状态。 我也经历了佐贺patterns.will它满足了这种矛盾 谁能为此提出更好的解决方案?

    • 最近在学微服务的分布式事务,不太明白为什么在微服务这种分布式系统中,原有的单体acid会出现问题 希望大佬们可以讲一下原理和思想

    • 假设我们有一个用户、Wallet REST微服务和一个将事情粘合在一起的API网关。当Bob在我们的网站注册时,我们的API网关需要通过用户微服务创建一个用户,通过钱包微服务创建一个钱包。 下面是一些可能出错的场景: > 用户Bob创建失败:没关系,我们只需向Bob返回一个错误消息。我们使用的是SQL事务,所以没有人在系统中看到Bob。一切都很好:) 创建了用户Bob,但在创建钱包之前,我们的AP

    • 得到了一个使用:< code>spring-boot、< code>spring-cloud、< code>postgresql作为微服务系统的项目。 有 2 个服务,比如 SA 和 SB,它们分别在 2 个 RDBMS 数据库上运行,比如 DA 和 DB。 现在,有一个包含2个子步骤的操作: Http客户端会向服务SA发出请求,将记录保存到中。 然后,SA向服务SB发送请求,将记录保存到中。 作

    • ShardingSphereTransactionManager SPI 名称 详细说明 ShardingSphereTransactionManager 分布式事务管理器 已知实现类 详细说明 XAShardingSphereTransactionManager 基于 XA 的分布式事务管理器 SeataATShardingSphereTransactionManager 基于 Seata 的分