Seata分布式事务 - xinwu-yang/cube-java GitHub Wiki
基础介绍
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata术语
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
模式介绍
AT
在 AT 模式下,用户只需关心自己的 “业务SQL”,AT 模式分为两个阶段:
一阶段:执行用户SQL
在一阶段,Seata 会拦截“业务 SQL”,首先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行锁。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
select id, name, since from product where name = 'TXC';
二阶段:Seata框架自动生成
- 二阶段提交
二阶段如果是提交的话,因为“业务 SQL”在一阶段已经提交至数据库, 所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。
- 二阶段回滚
二阶段如果是回滚的话,Seata 就需要回滚一阶段已经执行的“业务 SQL”,还原业务数据。回滚方式便是用“before image”还原业务数据;但在还原前要首先要校验脏写,对比“数据库当前业务数据”和 “after image”,如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要人工处理。
优点:
AT 模式的一阶段、二阶段提交和回滚均由 Seata 框架自动生成,用户只需编写“业务 SQL”,便能轻松接入分布式事务,AT 模式是一种对业务无任何侵入的分布式事务解决方案。
TCC 模式
-
Try:做业务检查和资源预留
-
Confirm:确认提交
-
Cancel:业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放
阶段1:检查资源是否足够,足够则冻结资源,执行try方法
阶段2:执行成功,则执行Confirm方法删除冻结资源。执行失败,执行Canel逻辑,恢复冻结资源
优缺点:
相对于 AT 模式,TCC 模式对业务代码有一定的侵入性,但是 TCC 模式无 AT 模式的全局行锁,TCC 性能会比 AT 模式高很多。
Sage
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。
适用场景:
-
业务流程长、业务流程多
-
参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口
优势:
-
一阶段提交本地事务,无锁,高性能
-
事件驱动架构,参与者可异步执行,高吞吐
-
补偿服务易于实现
缺点
- 不保证隔离性(应对方案见用户文档)
三种异常
- 空补偿:原服务未执行,补偿服务执行了
出现原因: 原服务超时(丢包) Saga 事务触发回滚 未收到原服务请求,先收到补偿请求
- 悬挂:补偿服务比原服务先执行
原服务超时(拥堵) Saga 事务回滚,触发回滚 拥堵的原服务到达
- 幂等:原服务与补偿服务都需要保证幂等性
XA
在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。
执行阶段:
可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚 持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)
完成阶段:
分支提交:执行 XA 分支的 commit 分支回滚:执行 XA 分支的 rollback
如何选择模式?
-
AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。
-
TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。
-
Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
-
XA模式是分布式强一致性的解决方案,但性能低而使用较少。