首页 > 其他分享 >分布式事务方案分析-XA、TCC以及阿里seata

分布式事务方案分析-XA、TCC以及阿里seata

时间:2023-05-23 18:05:03浏览次数:46  
标签:事务 seata XA tcc 阶段 提交 TCC 分布式



文章目录

  • 1 xa协议
  • 1.1 什么是xa协议?
  • 1.2 二阶段提交-2pc
  • 1.3 三阶段提交-3pc
  • 1.4 xa最佳实践
  • 2 tcc协议
  • 2.1 tcc方案简介
  • 2.2 tcc方案评估
  • 3 阿里seata方案
  • 4 本文小结
  • 本文参考


1 xa协议

1.1 什么是xa协议?

XA协议采用两阶段提交方式来管理分布式事务。该协议分为预备和提交两个阶段:

  • 预备:负责执行业务逻辑
  • 提交:负责事务的commit

DTP模型

DTP (distributed Transaction Processing) 模型,是一个名叫 The Open Group 的组织提出的分布式事务处理规范,已经成为事实上的事务模型组件的行为标准。

DTP规范包括AP(应用程序)、RM(资源管理器)、TM(事务管理器)三部分组成,其具体分工如下:

  • AP: 负责事务发起和结束;
  • RM:负责管理每个数据库的连接数据源;
  • TM:负责事务的全局管理,包括事务的生命周期管理和资源的分配协调;

XA协议

xa协议规范了TM和RM之间的的通信接口,在tm与多个rm之间形成了一个双向通信桥梁,保证操作多个数据库时的ACID特性!

分布式事务方案分析-XA、TCC以及阿里seata_XA

1.2 二阶段提交-2pc

二阶段提交流程:

XA规范实现的分布式事务属于二阶段提交事务,通过两个阶段来完成分布式事务的提交:

  • 第一阶段: 应用程序发起事务提交请求,事务管理器向各个资源管理器发起预提交请求;此时资源管理开始执行本地数据库事务,但是执行完成后不立刻提交事务,仅返回就绪或者未就绪状态;
  • 第二阶段:
  • 如果所有资源管理器返回就绪状态,事务管理器则会向各个资源管理器发送commit通知,资源管理器完成本地事务提交;
  • 如果任意资源返回未就绪状态,事务管理器想所有资源发送事务回滚通知,此时各个资源管理回滚本地数据库事务,释放资源,返回结果通知;

二阶段提交问题:

  1. 阻塞问题:预提交阶段需要等到所有资源管理器返回状态,才能进入第二阶段;
  2. 数据不一致问题:如果网络阻塞,发生commit收不到通知,则存在数据不一致问题;

1.3 三阶段提交-3pc

三阶段提交流程:

三阶段提交未减少二阶段提交的阻塞以及数据不一致问题而生,将执行过程分成了三个阶段来完成分布式事务提交:

  • 第一阶段:准备阶段canCommit。事务管理器向各个资源管理器询问节点会否可以执行事务,都返回ok才进入第二阶段。
  • 第二阶段:预提交阶段preCommit。各个节点真正执行事务阶段。
  • 第三阶段:提交确认阶段doCommit。提交或者回滚阶段。

三阶段优缺点评估:

  • 优点:
  • TM和RM都引入超时机制,解决了长时间阻塞的问题;
  • 检查阶段规避风险,避免失效问题;
  • 缺点:
  • 仍然未解决网络拥塞在提交阶段造成的数据不一致问题;

1.4 xa最佳实践

同一个事务上下文中需要协调多种资源(即数据库以及消息主题或队列时)才有必要使用X/Open XA接口

2 tcc协议

2.1 tcc方案简介

TCC方案是采用最终一致性的方式实现的服务层柔性分布式事务方案。

tcc协议采用try、confirm、cancel三个阶段来处理分布式事务。其中:

  • try: 负责冻结提前预留资源;
  • confirm:用来执行业务逻辑;
  • cancel:用来释放业务资源;

如果在提交解决及确认和cancel阶段失败,tcc会不停充实调用confirm或者cancel方法,直到成功为止;

分布式事务方案分析-XA、TCC以及阿里seata_XA_02

2.2 tcc方案评估

  • 优点:
  • jta方案只能解决同一服务的多数据源的分布式事务问题tcc方案可以解决微服务架构内同一事务多个服务上连接数据库的数据提交操作。
  • xa协议采用刚性事务方案,性能和吞吐率较低,tcc采用柔性分布式事务方案;
  • 缺点:
  • 对业务的侵入性较大:需要考虑预留资源、编写大量业务代码的try、confirm、cancel方法,考虑方法幂等性问题;

3 阿里seata方案

seata github链接

seata是阿里开源的一套的分布式事务解决方案,采用业务无侵入架构,解决分布式事务问题。

其具体结构如下指示:

分布式事务方案分析-XA、TCC以及阿里seata_二阶段提交_03

下图是笔者整理的seata方案的事务提交流程:

分布式事务方案分析-XA、TCC以及阿里seata_二阶段提交_04

下图为git仓库方案示意图:

分布式事务方案分析-XA、TCC以及阿里seata_SEATA_05

seata相对于其它分布式事务的最大区别是在第一提交阶段就将各个事务进行了commit操作,这样节约了两个阶段持有锁的事件,提高了整体的执行效率。通过xid管理全局事务,如果要全局回滚,通过xid找到对应的回滚日志记录,通过回滚记录生成反向更新sql,进行更新回滚操作;

4 本文小结

本文主要讨论了分布式事务处理的一些基本方法,并对阿里开源的分布式事务处理框架作了一个简单的说明,后续会给出一篇关于其的详细分析文章。

对于分布式事务处理,主要分两种情况讨论:

  • 同服务多数据源操作不同数据库的场景:通常采用基于xa协议的二阶段提交方式,但是考虑到阻塞、数据库不一致问题,通常采用三阶段提交进行优化。
  • 多服务多数据源场景(微服务场景):通常采用tcc方案实现分布式事务,常用的中间件有tcc-transaction. tcc也是基于二阶段提交理论完成,但是将相关理论提到了服务层实现,属于一种侵入式方案。阿里seata方案设计初衷就是解决分布式事务低效、侵入问题,具有较好设计思路,但是稳定性有待验证。

本文参考

  1. 极客时间 - java性能调优-刘超
  2. https://github.com/seata/seata
  3. 《深入分布式缓存》


标签:事务,seata,XA,tcc,阶段,提交,TCC,分布式
From: https://blog.51cto.com/u_13674158/6333872

相关文章

  • xargs命令备忘
    文章目录1xargs简介2基本应用3进阶:参数替换4进阶:使用-0分割5实用妙招5.1下载文件内的所有url内容5.2将入参分割成指定组数5.3使用指定分割功能将一个字符串分割多个参数6备忘1xargs简介xargs可以将标准输入作为输入内容转换成后续命令行的参数;通常用于标准输入或者处......
  • Seata 0.8.0 正式发布
    java4all原创,欢迎关注摘要:Seata0.8.0正式发布。Seata0.8.0正式发布。Seata是阿里巴巴开源的分布式事务中间件,以高效并且对业务0侵入的方式,解决微服务场景下面临的分布式事务问题。0.8.0版本主要feature:1.支持oracle数据库的AT模式;2.支持oracle数据库的批量操作;3.支持u......
  • [React Typescript] Useful React Prop Type Examples
    RelevantforcomponentsthatacceptotherReactcomponentsasprops.exportdeclareinterfaceAppProps{children?:React.ReactNode;//best,acceptseverythingReactcanrenderchildrenElement:JSX.Element;//AsingleReactelementstyle?:React.C......
  • Seata 的可观测实践
    作者:察溯Seata简介Seata的前身是阿里巴巴集团内大规模使用保证分布式事务一致性的中间件,Seata是其开源产品,由社区维护。在介绍Seata前,先与大家讨论下我们业务发展过程中经常遇到的一些问题场景。业务场景我们业务在发展的过程中,基本上都是从一个简单的应用,逐渐过渡到规模......
  • 聊聊Seata分布式解决方案AT模式的实现原理
    什么是Seata分布式事务解决方案Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。AT模式AT模式目前来看是Seata框架独有的一种模式,其它的分布式框架上并没有此种模式......
  • XAF中XPO与EFCore的探讨
    前言首先抛出一个问题,在XAF项目中,我们现在可不可以选择EFCore?每个人可能都有自己的答案,这也没有什么标准答案。下面是我的个人看法,在刚接触XAF时,如何选择ORM,我也是犹豫了许久,最终选择了XPO,主要基于以下几点考虑1.XPO是DEV的产品,支持力度及倾向性要比EFCore高2.XPO是XAF最开始支......
  • 通过docker启动seata-server
    1、获取镜像(需要获取和自己依赖匹配的版本),这里我获取的是1.4.2dockerpullseataio/seata-server:1.4.22、启动镜像,将seata-server的配置文件复制到当前系统中随便启动以下dockerrun--nameseata-server-p8091:8091-dseataio/seata-server:1.4.2将配置文件所在的文件......
  • 关于STM32Cube_FW_F1_V1.8.0内的example顶层程序设计逻辑 与 RTC_Calendar增补
     Examples内程序结构STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Examples内程序结构分析如下:使用外设XXX向工程添加 stm32f10x_XXX.c修改stm32f10x_conf.h 在stm32f1xx_hal_msp.c中写 外设XXX写初始化程序在stm32f1xx_it.c中写中断服务程序在main.c中写配置程......
  • 庆军之xamarin.forms 第一次简单总结
    在我写了单元测试,并且手搓通过了单元测试之后。打包给了客户。客户反馈的问题是,数据只有一条。找了很久的原因。最后发现,因为没有为弹窗写单元测试。本来的回传数据,我写的,获取到数据之后。this.Model.Insert(0,数据),回传this.Model[this.Model.Count-1],最后只有一条数据了。总......
  • wpf XAML 设计器异常,提示NullReferenceException 未将对象引用设置到对象
     在cs构造函数里手动注册,并且在控件的构造函数里增加判断if(DesignerProperties.GetIsInDesignMode(this)){return;}//在这里才注册Load事件cmbSpeed.Loaded+=cmbSpeed_Loaded;来源:https://www.cnblogs.com/zsx-blog/p/8311633.html ......