Seata分布式事务AT、TCC、SAGA、XA模式

这篇具有很好参考价值的文章主要介绍了Seata分布式事务AT、TCC、SAGA、XA模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

AT模式

🍮实现原理
阿里SEATA独有模式,通过生成反向SQL实现数据回滚,需要在数据库额外附加UNDO_LOG表,UNDO_LOG表中保存的是自动生成的回滚SQL。

举个🌰

insert into 订单 values(1001,...)
update 仓储 set num = 300 where gid =100

自动生成UNDO_LOG回滚日志

DELETE FROM 订单 where id =1001
update 仓储 set num=210 where gid = 100

特点

性能:高
模式:AP,存在数据不一致的中间状态
难易程度:简单,靠SEATA自己解析反向SQL并闻滚

使用要求:
所有服务与数据库必须要自己拥有管理权,因为要创建UNDO LOG表
最好都是MySQL,听说也支持PSQL,不过没试验过

应用场景:
高并发互联网应用,允许数据出现短时不一致,可通过对账程序或补录来保证最终一致性。

TCC模式

🍮实现原理
TCC是Try-尝试、Confirm-确认、Cancel-取消Try尝试阶段,对资源进行锁定。
Confirm确认阶段,对资源进行确认,完成操作Cancel取消阶段,对资源进行还原,取消操作。

在代码与数据表中扩展字段,实现对特定数据资源的锁定。

Try阶段:预留所需的资源,预增金额,冻结库存
Confirm确认阶段:把预留的资源放入真实资源字段,清空预留资源
Seata分布式事务AT、TCC、SAGA、XA模式

cancel阶段:对锁定的资源释放
Seata分布式事务AT、TCC、SAGA、XA模式

特点

性能:好
模式:AP,存在数据不一致的中间状态
难易程度:复杂,SEATA TC只负责全局事务的提交与回滚指令,具体的回滚处理全靠程序员自己实现(每个业务流程车都需手动写代码TRY,COMMIT,CANCEL三个对应的方法)

使用要求:
所有服务与数据库必须要自己拥有管理权
支持异构数据库,可以使用不同选型实现

应用场景:
高并发互联网应用,允许数据出现短时不一致,可通过对账程序或补录来保证最终一致性。

SAGA模式

🍮实现原理
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务具体实现者开发实现。

Saga相关概念

1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transaction(长活事务)。Saga是一个长活事务可被分解成可以交错运行的子事务集合。其中每个子事务都是一个保持数据库一致性的真实事务。 论文地址:sagas

Saga的组成
每个Saga由一系列sub-transaction Ti 组成

每个Ti 都有对应的补偿动作Ci,补偿动作用于撤销Ti造成的结果
可以看到,和TCC相比,Saga没有“预留”动作,它的Ti就是直接提交到库。

Saga的执行顺序有两种:
T1, T2, T3, …, Tn
T1, T2, …, Tj, Cj,…, C2, C1,其中0 < j < n

Saga定义了两种恢复策略

  • backward recovery,向后恢复,补偿所有已完成的事务,如果任一子事务失败。即上面提到的第二种执行顺序,其中j是发生错误的sub-transaction,这种做法的效果是撤销掉之前所有成功的sub-transation,使得整个Saga的执行结果撤销。

  • forward recovery,向前恢复,重试失败的事务,假设每个子事务最终都会成功。适用于必须要成功的场景,执行顺序是类似于这样的:T1, T2, …, Tj(失败), Tj(重试),…, Tn,其中j是发生错误的sub-transaction。该情况下不需要Ci。

显然,向前恢复没有必要提供补偿事务,如果你的业务中,子事务(最终)总会成功,或补偿事务难以定义或不可能,向前恢复更符合你的需求。

理论上补偿事务永不失败,然而,在分布式世界中,服务器可能会宕机,网络可能会失败,甚至数据中心也可能会停电。在这种情况下我们能做些什么? 最后的手段是提供回退措施,比如人工干预。
Seata分布式事务AT、TCC、SAGA、XA模式
这里比如支付宝只提供了转账接口和退款接口,而你具体负责商城订单业务,正向流程下单-支付成功-扣减库存-订单状态变更为待发货。

如果扣减库存失败,比如库存为0扣减失败了,这时候你需要自行调用支付宝的退款接口,模拟事务回滚的业务流程,支付宝是不会帮你实现事务回滚的。

特点

性能:不一定,取决于三方服务,不推荐此种分布式事务
模式:AP,存在数据不一致的中间状态
难易程度:1.复杂,提交与回滚流程全靠程序员编排,代码逻辑难以理解,后期更是难以维护和升级。2.可能会出现循环依赖的死循环。3.两种恢复策略需要保证原子性

使用要求:
在当前架构引入状态机机制,类似于工作流
引入原子性,确保forward和backward时重复执行
无法保证隔离性

应用场景:
基本不推荐此种分布式事务。需要与第三方交互时才会考虑,例如:调用支付宝支付接口->出库失败->调用支付宝退款接口

和TCC对比

Saga相比TCC的缺点是缺少预留动作,导致补偿动作的实现比较麻烦:Ti就是commit,比如一个业务是发送邮件,在TCC模式下,先保存草稿(Try)再发送(Confirm),撤销的话直接删除草稿(Cancel)就行了。而Saga则就直接发送邮件了(Ti),如果要撤销则得再发送一份邮件说明撤销(Ci),实现起来有一些麻烦。

XA模式

🍮实现原理
基于数据库的XA协议来实现2PC又称为XA方案,数据库必须实现并支持XA协议
Seata分布式事务AT、TCC、SAGA、XA模式

特点

性能:低
模式:CP,强一致性
难易程度:简单,基于数据库自带特性实现,无需改表

使用要求:
使用支持XA方案的关系型数据库(主流都支持)

应用场景:
金融行业,并发量不大,但数据很重要的项目

总结:

可以看出,所有分布式方式都是两阶段模式,成功提交,失败回滚。而根据实现难度,TCC和SAGA都需要手动实现业务回滚代码,复杂度要高一些。其他都可以有数据库或者第三方事务管理器实现回滚业务流程,而你只需要专注业务流程本身。

AT模式需要所有参与方都有数据库权限,这点如果项目参与方都是一起的不涉及第三方或许可以实现。但如果你调用的是第三方服务,显然不可能支持,第三方更不可能给你提供数据库访问权限,比如支付服务,任何第三方支付都不可能提供数据库权限给你。

因此要综合考虑自己的使用情况,再决定使用哪种模式。
但是现实中,分布式事务还是要根据情况去使用,绝大多数项目能不是使用分布式事务就不会使用。只要确保最终事务一致性即可。文章来源地址https://www.toymoban.com/news/detail-467684.html

到了这里,关于Seata分布式事务AT、TCC、SAGA、XA模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式软件架构——分布式事务TCC和SAGA

    TCC 是另一种常见的分布式事务机制,它是“ Try-Confirm-Cancel ”三个单词的缩写,是由数据库专家 Pat Helland 在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。 前面介绍的可靠消息队列虽然能保证最终的结果是相对可靠的,过程也足够简单(相对于

    2024年02月12日
    浏览(43)
  • 3分钟带你了解下分布式事务TCC与SAGA

    文章首发地址 TCC(Try-Confirm-Cancel)是一种分布式事务方案,它通过将事务拆分成“尝试(Try)”、“确认(Confirm)”和“取消(Cancel)”三个阶段来实现。 在TCC中,每个参与者都需要实现这三个阶段来协调分布式事务的执行。具体流程如下: 尝试(Try)阶段:在这一阶段中

    2024年02月14日
    浏览(45)
  • 分布式事务Seata实战-AT模式(注册中心为Eureka)

    大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。 官网:Seata AT 模式 | Apache Seata™ 官方代码示例:   快速启动 | Apache Seata™ 此文章涉及的项目代码链接:seata-at: 分布式事务解

    2024年01月19日
    浏览(44)
  • springcloud3 分布式事务解决方案seata之AT模式5

    1.XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源; 2.XA模式依赖数据库机制实现回滚;AT模式利用数据库快照实现数据回滚 3.XA模式强一致;AT模式最终一致。 1.2 AT模式原理 一阶段: 1.TM发起并注册全局事务到TC; 2.TM调用分支事务; 3.RM进行注册分支

    2024年02月07日
    浏览(51)
  • 聊聊Seata分布式解决方案AT模式的实现原理

    Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 AT模式目前来看是Seata框架独有的一种模式,其它的分布式框架上并没有此种模式的实现。其是由二阶段提

    2024年02月05日
    浏览(42)
  • 微服务13-Seata的四种分布式事务模式

    XA模式分为两种情况 : 提交成功: 提交失败: 具有强一致性seata相当于是在RM上做了一层封装; XA模式 优点 : 1.事务的强一致性,只要有失败的,TC事务协调者就会发送信息让RM回滚——满足ACID原则 2.没有代码侵入,常用数据库都支持 缺点 : 1.第一阶段就要锁定数据库资源

    2024年02月07日
    浏览(43)
  • 分布式事务TCC 你真的理解了吗

    TCC(补偿事务) TCC 属于目前比较火的一种柔性事务解决方案。TCC 这个概念最早诞生于数据库专家帕特 · 赫兰德(Pat Helland)于 2007 发表的 《Life beyond Distributed Transactions: an Apostate’s Opinion》 这篇论文,感兴趣的小伙伴可以阅读一下这篇论文。 三个阶段 简单来说,TCC 是 Tr

    2024年02月02日
    浏览(38)
  • 分布式事务-TCC案例分析流程图

    防止cancel方法在最后执行出现问题,用户收到提示已经退款成功但是由于cancel过慢或者出现问题(虽然最后会重试成功但是用户体验很差),可以做以下的业务sql模型优化(增加一个冻结金额)。

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包