微服务分布式事务XA模型面试不发愁,一致性选型不担忧

开课吧樵夫2021-12-22 16:48

  XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。

  XA 规范 描述了全局的事务管理器与局部的资源管理器之间的接口。XA规范 的目的是允许的多个资源(如数据库,应用服务器,消息队列等)在同一事务中访问,这样可以使 ACID 属性跨越应用程序而保持有效。

  XA 规范 使用两阶段提交(2PC,Two-Phase Commit)来保证所有资源同时提交或回滚任何特定的事务。

  XA 规范 在上世纪 90 年代初就被提出。目前,几乎所有主流的数据库都对 XA 规范 提供了支持。

  Seata 事务模式定义

  Seata 定义了全局事务的框架。

  全局事务 定义为若干 分支事务 的整体协调:

  TM 向 TC 请求发起(Begin)、提交(Commit)、回滚(Rollback)全局事务。

  TM 把代表全局事务的 XID 绑定到分支事务上。

  RM 向 TC 注册,把分支事务关联到 XID 代表的全局事务中。RM 把分支事务的执行结果上报给 TC。(可选) TC 发送分支提交(Branch Commit)或分支回滚(Branch Rollback)命令给 RM。

微服务分布式事务XA模型面试不发愁,一致性选型不担忧

  Seata 的 全局事务 处理过程,分为两个阶段:

  执行阶段:执行分支事务,并 保证执行结果满足是 可回滚的(Rollbackable)和持久化的(Durable)。

  完成阶段:根据 执行阶段结果形成的决议,应用通过 TM发出的全局提交或回滚的请求给 TC, TC命令 RM驱动 分支事务进行 Commit或 Rollback。

  Seata的所谓 事务模式是指:运行在Seata全局事务框架下的 分支事务的行为模式。准确地讲,应该叫作 分支事务模式。

  不同的事务模式区别在于分支事务 使用不同的方式达到全局事务两个阶段的目标。即,回答以下两个问题:

  执行阶段 :如何执行并保证执行结果满足是 可回滚的(Rollbackable) 和 持久化的(Durable)。

  完成阶段:收到TC 的命令后,如何做到分支的提交或回滚?

  以我们Seata的 AT模式和TCC 模式为例来理解:

  Seata 支持XA目标

  为什么要在 Seata 中增加 XA 模式呢?支持 XA 的意义在哪里呢?

  补偿型事务模式的问题

  本质上,Seata 已经支持的 3 大事务模式:AT、TCC、Saga 都是补偿型 的。

  补偿型 事务处理机制构建在 事务资源之上(要么在中间件层面,要么在应用层面),事务资源 本身对分布式事务是无感知的。

微服务分布式事务XA模型面试不发愁,一致性选型不担忧

  事务资源 对分布式事务的无感知存在一个根本性的问题:无法做到真正的 全局一致性 。

  比如,一条库存记录,处在 补偿型 事务处理过程中,由 100 扣减为 50.此时,仓库管理员连接数据库,查询统计库存,就看到当前的 50.之后,事务因为异外回滚,库存会被补偿回滚为 100.显然,仓库管理员查询统计到的 50 就是 脏 数据。

  可以看到,补偿型 分布式事务机制因为不要求 事务资源 本身(如数据库)的机制参与,所以无法保证从事务框架之外的全局视角的数据一致性。

  XA 的价值

  与 补偿型 不同,XA 协议 要求 事务资源 本身提供对规范和协议的支持。