Seata的AT模式的执行流程

78 阅读3分钟

Seata简介

Seata阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

AT事务模式

使用AT事务模式的前提

  • 基于支持本地ACID事务的关系型数据库
  • Java应用,通过JDBC访问数据库

AT整体机制

两阶段提交协议的演变

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

AT事务模式的执行流程

image.png

一阶段

Seata架构中一共有三种角色,TC,TM,RM

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

TM(全局事务)向TC(事务协调者)发送请求,开启全局事务,TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号。

**XID**,会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起。
注册事务

TM调用分支事务(RM),分支事务向TC注册分支事务,RM 请求 TC 将本地事务注册为全局事务的分支事务,通过全局事务的 XID 进行关联。

分支事务执行sql语句

RM开始执行自己本地的sql语句,执行完成后向TC报告事务状态,并且每一个RM展示保存一个undoLog的快照。

TM 事务管理器请求本次事务结果

TM 请求 TC 告诉 XID 对应的全局事务是进行提交还是回滚。TC 驱动 RM 们将 XID 对应的自己的本地事务进行提交还是回滚。

TC判断提交还是回滚

如果有任何一个RM的事务失败,那么所有的分支事务都会进行根据之前保留的undoLog进行回滚。如果所有的分支事务都已经执行成功,undoLog日志文件会被删除掉。

总结

当所有的分支事务都被提交之后或者都被回滚,那么本次事务就会结束

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态 阶段二提交时RM的工作:
  • 删除undo-log即可 阶段二回滚时RM的工作:
  • 根据undo-log恢复数据到更新前