Seata简介
Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
AT事务模式
使用AT事务模式的前提
- 基于支持本地ACID事务的关系型数据库
- Java应用,通过JDBC访问数据库
AT整体机制
两阶段提交协议的演变
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
AT事务模式的执行流程
一阶段
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恢复数据到更新前