分布式事务

138 阅读3分钟

一、分布式事务解决方案

今天,说两种分布式事务解决方案:

  1. Seata框架
  2. MQ分布式事务

下面分别详细说一下这两个方案。

二、Seata框架

Seata事务管理中有三个重要角色:

  • TC(Transaction Coordinator)-事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM(Transaction Manager)-事务管理器:定义全局事务的范围,开启、提交、回滚全局事务。
  • RM(Resource Manager)-资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

Seata提供了三种分布式事务管理模式:XA模式、AT模式、TCC模式。

2.1、XA模式

1692434488880.jpg 在XA模式下,共分为2个阶段。

  1. RM一阶段的工作:

    1.1. 注册分支事务到TC。

    1.2. 执行分支事务SQL但不提交。

    1.3. 报告执行状态到TC。

  2. TC二阶段的工作:

    TC检测各分支事务执行状态:

    • 如果都成功,通知所有RM提交事务。
    • 如果有失败,通知所有RM回滚事务。
  3. RM二阶段的工作: 接收TC指令,提交或回滚事务。

XA模式采用了CP协议,需要互相等待各个分支事务提交,可以保证强一致性,性能差。

2.2、AT模式(推荐)

AT模式同样是分阶段提交的事务模型,不过弥补了XA模式中资源锁定周期过长的缺陷。

1692436155458.jpg

  1. 阶段一RM的工作:

    • 注册分支事务。
    • 记录undo-log(数据快照)
    • 执行业务SQL并提交
    • 报告事务状态。
  2. 阶段二提交时RM的工作:

    • 删除undo-log即可。
  3. 阶段二回滚时RM的工作:

    • 根据undo-log恢复数据到更新前。

AT模式采用了AP协议,分支事务之间各自提交,不需要互相等待。做到了高可用。

2.3、TCC模式

  1. Try:资源的检测和预留。
  2. Confirm: 完成资源操作业务。要求Try成功Confirm一定成功。
  3. Cancel:预留资源释放,可以理解为Try的反向操作。

1692436988453.jpg

TCC模式采用了AP协议,需要人工编码实现,性能好。

三、MQ分布式事务

1692437369318.jpg

如上图所示案例,通过向借呗借钱增加支付宝账户余额。

  1. 借呗系统进行资质审核。审核通过后,生成借款单持久化到MySQL中,并且发送MQ消息给支付宝系统。
  2. 支付宝系统接收到消息后,执行本地事务,增加账户余额。
  3. 如果审核不通过,后者借款单入库失败,则就不用发消息。所以发送MQ消息和入库要放在同个一事务中执行。
  4. 如果支付宝系统执行本地事务失败,只能手动处理。
  • 优点:事务异步执行,性能比较高。
  • 缺点:无法保证实时性。
  • 使用场景:对实时性要求不高的系统。