定义:
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
AT模式 (AT模式支持的数据库有:MySQL、Oracle、PostgreSQL和 TiDB)
两阶段提交协议的演变:
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 二阶段:
-
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
个人理解:
1、有两个事务t1和t2,当t1拿到本地锁,t2就需等待t1本地锁的释放。
2、当t1本地锁执行的任务完成了,t1就会尝试拿全局锁,当t1拿到全局锁,t1就会释放本地锁,这时,t2就会拿到本地锁。
3、当t1全局锁执行任务失败了,需要回滚时,t1又会尝试拿本地锁,t2这时还在尝试拿全局锁,等t2超时时,t2会释放本地锁,这时t1拿到本地锁分支回滚成功。
TCC模式 (TCC模式不依赖数据源(1.4.2版本))
回顾总览中的描述:一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:
- 一阶段 prepare 行为
- 二阶段 commit 或 rollback 行为
相应的,TCC 模式,不依赖于底层数据资源的事务支持:
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
个人理解:
把分支的事务放到全局事务里面一起处理
saga模式
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。
Saga的实现:
基于状态机引擎的 Saga 实现:
目前SEATA提供的Saga模式是基于状态机引擎来实现的,机制是:
- 通过状态图来定义服务调用的流程并生成 json 状态语言定义文件
- 状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点
- 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚
注意: 异常发生时是否进行补偿也可由用户自定义决定
4.可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能
个人理解:
有很多分支都在本地提交事务,当某一个分支失败时,其他的分支之前已经成功了的,需进行补偿服务
xa模式
在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。
- 执行阶段:
-
- 可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚
- 持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)
- 完成阶段:
-
- 分支提交:执行 XA 分支的 commit
- 分支回滚:执行 XA 分支的 rollback
个人理解:
有很多分支都在本地提交事务,提交完成后,执行xa prepare,用以保证第二阶段回滚的时候能回滚成功
专业术语
TC(Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚
TM(Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM(Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
事务分组是什么?
事务分组是seata的资源逻辑,类似于服务实例。在file.conf中的my_test_tx_group就是一个事务分组。
跨服务调用的事务传播
通过上述基本原理,我们可以很容易理解:
跨服务调用场景下的事务传播,本质上就是要把 XID 通过服务调用传递到服务提供方,并绑定到 RootContext 中去。
只要能做到这点,理论上 Seata 可以支持任意的微服务框架。
一个典型的分布式事务过程
- TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID;
- XID 在微服务调用链路的上下文中传播;
- RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖;
- TM 向 TC 发起针对 XID 的全局提交或回滚决议;
- TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
个人对seata的理解:
1、有3个角色TC(事务协调者或事务推动者),TM(事务管理者或事务发起者,开启全局事务,发起提交or回滚),RM(资源管理器,注册分支事务,将其纳入管理全局xid管辖内)
2、非常重要的全局XID,XID是保证各分支一起提交,一起回滚的重要参数
3、nacos,seata,mysql等的安装和使用(注:踩了一个坑,mysql版本问题,写了mysql的日记 登录 · 语雀)
4、AT,TCC,SAGA是补偿型的,XA要求事务资源本身提供对规范和协议的支持
参考文献: