百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

分布式事务Seata框架的AT模式

bigegpt 2024-08-12 14:26 2 浏览

大纲

  • 分布式事务
  • seata架构

1.分布式事务

在分布式系统架构中,复杂的业务需要跨库操作,要保证全局的事务一致性问题就得需要解决分布式事务问题。

1.1 XA规范

XA规范中,规定了三种角色:AP应用程序、RM资源管理器(数据库)、TM事务管理器。XA规范定义了RM-TM的通信接口。

1.2 2PC两阶段提交

2PC和XA规范没有必然联系,但是2PC模式是对XA规范的一种抽象实现和优化。2PC一共有2个阶段:预提交和commit。

     1. TM通知每个RM准备提交各自的本地事务。
     1. TM根据步骤1各个RM反馈的预提交结果来决定是否下达commit的命令。

2PC存在几个严重的问题:

     - 阻塞延迟较大。
     - TM的单点故障问题。
     - 全局数据不一致问题,在阶段二中,TM下达了commit操作,但是只有一部分RM接收到了commit,一部分没有接收到,就产生了不一致的问题。

1.3 3PC三阶段提交

3PC是2PC的改进版本,但是没有本质区别,和2PC不同的是:

     - 引入了超时机制,在TM和RM都存超时机制。
     - 在2PC的预提交和commit中间穿插了一个准备阶段,所以3PC有3个阶段:CanCommit、PreCommit、Commit。

1.4 TCC

Try-Confirm-Cancel,本质也是业务服务化的两阶段提交协议,TCC一共有3个步骤,第一阶段需要由应用程序来进行对资源的预留,当所有参与者的try接口都成功了,那么事务管理器就会提交事务进行confirm,否则进行cancel回滚资源释放。TCC的try阶段一般需要将资源进行一个前置快照将事务数据的改变记录下来,后续在提交或者回滚的时候基于这个记录进行一致性对齐操作。

1.5 柔性事务

柔性事务指的是服务基本可用、软状态/中间态、最终一致;核心思想就是分布式环境下无法保证强一致性,而是结合自身的业务场景做一些妥协。常见的柔性事务解决方案有:最大努力通知、补偿、最终一致性/异步确保、两阶段提交式。

C++后台开发架构师免费学习地址:Linux C/C++后台开发学习资料

另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以自行添加:720209036 :qun文件共享入~ 群文件共享

2.Seata

Seata是一个阿里开源的分布式事务解决框架。它支持AT、TCC、Saga、XA多种模式。Seata的组织架构中有三个角色:

  • TC(Transaction Coordinator)事务协调器:维护全局的事务和分支事务的信息,控制全局事务的提交或者回滚,TC是需要独立部署的一个服务,而TM和RM是一个client客户端依赖到项目里。
  • TM(Transaction Manager)事务管理器:全局事务的开启和边界的定义。
  • RM(Resource Manager)资源管理器:对本地分支事务的管理,负责和TC交互和报告事务状态,执行具体的提交或者回滚。

3.Seata AT模式(主流)

Seata支持多种分布式事务模式,官方主推的是AT模式,AT模式是一种无侵入式的、类似于自动化的隐式TCC模式。AT模式一共分为2个阶段:

  1. 业务数据和undoLog记录在同一个事务中并提交,随后释放本地锁和连接资源。
  2. 如果需要提交,则异步提交。如果需要回滚,则本地执行undoLog进行反向补偿。

3.1 AT模式的优点

  - 自动化的代理了DataSource,自动化实现了补偿逻辑,降低了业务代码入侵。
  - TC事务协调者的引入,简化了一些事务控制逻辑。
  - 分布式事务的隔离性通过全局锁和本地锁来保证实现了写隔离和读隔离。
复制代码

一阶段本地事务Commit之前需要拿到全局事务锁; 如果没有拿到全局锁则提交不了本地事务,尝试获取全局锁有时间次数限制,超过阈值则执行本地事务的回滚。

3.2 AT模式的不足

     - 性能,事务过程中涉及多次的RPC远程调用和各种SQL解析和快照落库。
     - 对于热点数据的隔离性问题存在性能问题。
     - 因为引入了锁的机制,可能会造成死锁,虽然有超时时间,但是对性能还是有影响。



原文链接:https://juejin.cn/post/7123890107966292005

相关推荐

为3D手游打造, Visual Studio Unity扩展下载

IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

由ArcMap属性字段自增引出字段计算器使用Python的技巧

1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

微软首次回答 HoloLens 相关问题,终于爆料了

fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...

C#指针的应用(c#指针类型)

C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...

C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)

C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...

欢迎回来:Fortran意外重回流行编程语言20强榜单

TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...

C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案

简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...

C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤

在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...

C# (一)状态机模式(状态机代码实现)

最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...

C# 中 Predicate 详解(c#中的replace)

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...

C#中$的用法?(c#中&&什么意思)

文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...

C#并行编程:Parallel类(c# 并行处理)

在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...

颠覆认知!用Span重构foreach循环竟让数据处理快如闪电

在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...

Unity3D手游开发实践《腾讯桌球》客户端开发经验总结

本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...