深入浅出Seata的AT模式

news2024/11/15 12:12:32

单个掉队,导致集体被动摆烂;

一、业务背景

在分布式架构中,事务管理是个无法避开的复杂问题,虽然有多种解决方案,但是需要根据业务去选择合适的;

从个人最近几年的实践经验来看,Seata组件的AT模式比较常用,本文从实际的案例出发,来深入分析该模式的原理;

首先创建一个全局事务管理的接口,这里是在Facade服务中开启全局事务;

请求经过三个微服务,并且各个服务都进行数据源的操作,然后模拟链路成功和异常的情况,来分析不同状态的逻辑实现;

二、Seata架构

1、核心组件

三大组件

  • TC:事务协调者

即Transaction Coordinator,维护全局和分支事务的状态,驱动全局事务提交或回滚。

  • TM:事务管理器

即Transaction Manager,定义全局事务的范围,开始事务、提交事务,回滚事务。

  • RM:资源管理器

即Resource Manager,管理分支事务处理的资源,向TC注册分支事务,报告分支事务的状态,驱动分支事务提交或回滚。

基础交互

TC是需要独立部署的服务,TM和RM是集成在服务中,三大组件相互协作,共同完成分布事务的管理;

2、AT模式

事务模型

AT是Seata默认的模式,需要基于支持本地ACID事务的关系型数据库;Java应用,通过JDBC访问数据库;基于案例流程,先分析AT的事务模型;

2.1 TM负责定义全局事务的边界,向TC申请,开启一个全局事务;

2.2 全局事务创建成功后,生成全局唯一的XID;

2.3 XID会在微服务请求链路上下文中传播;

2.4 RM向TC注册分支事务,并归属到XID对应的全局事务进行调度;

2.5 TM向TC发起相应XID的全局事务提交或回滚决议;

2.6 TC完成对XID管理的全部分支事务提交或回滚的调度;

核心机制

执行阶段:每个微服务的请求完成后,基于本地数据库的事务能力,保证业务数据和回滚日志在同一个本地事务中提交,快速释放连接和对资源的锁定;

完成阶段:全局提交时分支事务已经完成提交,会清理回滚日志,快速结束流程;全局回滚基于XID和BranchID查询回滚日志,完成数据回滚;

数据源代理

在AT模式中,应用需要使用Seata组件中的JDBC代理数据源DataSourceProxy,实现对真正目标数据源的代理访问;

三、案例分析

1、流程分析

案例的简单描述

在案例中涉及三个服务,Facade服务开启全局事务,然后分别请求Account和Quartz服务的更新接口,通过Quartz接口是否抛异常来调试AT模式的原理;

从实际的请求执行来说,绝大多数的请求都是可以执行成功的,而AT模式的异步化提交极大限度的顾及全局事务的效率问题,少数失败的情况也可以通过回滚日志进行反向补偿;

2、写隔离

上述流程分析AT模式的原子性,即多个分支事务要么都成功要么都失败,接下来分析多个事务中的全局锁隔离机制,先看写隔离,假设TX1先开始;

TX1逻辑

  • TX1开始本地事务,拿到本地锁,然后执行更新操作;
  • TX1本地事务提交前,需要先获取全局锁,否则无法提交;
  • TX1获取全局锁并提交,释放本地锁,但未释放全局锁;

TX2逻辑

  • TX2此时开始本地事务,拿到本地锁;
  • TX2执行本地事务提交前,尝试获取全局锁;
  • 由于全局锁被TX1持有,TX2会重试等待全局锁;

假设TX1全局提交

  • TX1如果全局事务提交,会释放全局锁;
  • TX2获取全局锁成功,执行本地事务提交;

假设TX1全局回滚

  • TX1如果全局事务回滚,要重新获取数据的本地锁,进行回滚的补偿动作;
  • TX2如果仍在等待全局锁,并且还持有本地锁,TX1事务回滚失败,会不断的重试;
  • 当TX2等待全局锁超时,会放弃全局锁并回滚本地事务,释放本地锁;
  • TX1最终获取数据的本地锁,完成回滚动作;

在该过程中,TX1在结束前一直持有全局锁,TX2获取不到全局锁无法对相同的数据执行更新动作,所以避免了脏写的问题;

3、读隔离

在数据库本地隔离级别为读已提交或以上的基础上,Seata的AT模式默认全局隔离级别是读未提交;如果需要全局的读已提交,可以通过SELECT FOR UPDATE语句的代理;

该语句的执行也需要获取全局锁,如果全局锁被TX1持有,TX2会释放本地锁,查询会被阻塞并进行重试,拿到全局锁读取成功后返回;

四、对比XA模式

XA是一个分布式事务分段提交协议;事务管理器即TM:作为全局事务的调度者,负责整个事务中本地资源的提交和回滚;本地资源管理器即RM:大部分关系型数据库都实现了XA接口;

TM先向所有的参与事务的RM发送确认请求,根据确认的结果,判断是调用RM的commit提交还是rollback回滚;

XA具有强一致性,在2段提交的过程中,会持有资源的锁,如果是在交易下单等复杂链路中,并且并发量很高,会存在长事务风险,XA无法满足该类高并发的场景;

而在Seata的AT模式中,在服务执行完成后,直接进行RM提交和资源释放,提供了对CAP理论相对平衡的解决方案,并且没有侵入业务工程;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC】SpringBoot使用线程池的两种方式 注解和注入

学习笔记一、ThreadPoolTaskExecutor与ThreadPoolExecutor的区别二、编写配置文件ThreadPoolConfig二、编写Controller三、编写Service3.1、注解3.1、注入一、ThreadPoolTaskExecutor与ThreadPoolExecutor的区别 ThreadPoolExecutor 是JDK自1.5添加的线程池。 ThreadPoolTaskE…

排序算法:插入排序,选择排序,冒泡排序

插入排序 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 步骤1: 从第一个元素开始,该元素可以认为已经被排序; 步骤2: 取出下一个元素,在已经排序的元素序列中从后向前扫描; 步骤3: 如…

[附源码]计算机毕业设计-中国传统手工艺销售平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]计算机毕业设计JAVA校园失物招领平台

[附源码]计算机毕业设计JAVA校园失物招领平台 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

李峋同款会动的爱心Python代码版

最近看到不少关于李峋同款爱心的视频、文章,今天我们也分享一下李峋同款爱心 Python 代码版。要问李峋是谁?我也不太清楚,大家可自行百度,这个是我百度的结果,仅供参考。 简单来说李峋同款爱心就是一个动态的♥型效果&…

【STM32学习(1)】详解STM32时钟体系

一、8051和stm32时钟体系结构区别 HSE:外部高速的振荡时钟(8MHZ) HSI:内部高速的振荡时钟(16MHZ) LSI:内部低速的振荡时钟(32KHZ) LSK:外部低速的振荡时钟&a…

HTML+CSS+JS静态网页设计【篮球NBA介绍体育运动】web前端学生作业源码

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【学习笔记】DDD领域驱动设计篇

【学习笔记】DDD领域驱动设计篇 文章目录【学习笔记】DDD领域驱动设计篇什么是DDD?DDD的优缺点DDD的架构框架详解User Interface层application层domain层infrastructure层结语什么是DDD? DDD 是 Domain driven design (领域驱动设计&#xf…

GIS工具maptalks开发手册(四)02——渲染地图信息框之添加绘制工具 获取面的坐标数据信息框进行展示 渲染图片的两种方式

GIS工具maptalks开发手册(四)02——渲染地图信息框之添加绘制工具 & 获取面的坐标数据信息框进行展示 & 渲染图片的两种方式 效果-获取面的坐标 效果-渲染图片的2种方式 代码 index.html <!DOCTYPE html> <html> <meta charset"UTF-8">…

[附源码]计算机毕业设计springboot校园招聘系统设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

家装家居行业该如何进行网络推广?

咱们这里谈家居家装行业&#xff0c;指得是置办新家的大件产品&#xff0c;不是锅碗瓢盆&#xff0c;也不是床单被罩那些。如衣柜、橱柜、灯具、智能马桶、窗户、瓷砖、沙发、床等等这些是咱们讨论的范围。 在家装家居行业中&#xff0c;每个产品的客单价通常很高&#xff0c;回…

更改 HIVE 表字段数据类型有哪些注意事项?

更改 HIVE 表字段数据类型有哪些注意事项&#xff1f; 1. 使用 HIVE 表的常见规范 在大数据离线分析场景中&#xff0c;在数据建模/表格式这一层&#xff0c;目前使用最多的还是 APACHE HIVE 这一数据仓库框架&#xff08;湖仓一体的框架&#xff0c;如 Iceberg/DeltaLake/Hu…

深入理解 Web 协议:HTTP 2

目录 本篇将详细介绍 http2 协议的方方面面&#xff0c;知识点如下&#xff1a; HTTP 2 连接的建立 HTTP 2 中帧和流的关系 HTTP 2 中流量节省的奥秘&#xff1a;HPACK 算法 HTTP 2 协议中 Server Push 的能力 HTTP 2 为什么要实现流量控制&#xff1f; HTTP 2 协议遇到的…

记一次PDU接室外监控溶解事故

近期要新增20-30个室外监控&#xff0c;监控位于山道&#xff0c;山道长约1000米&#xff0c;根据以往惯例&#xff0c;要求从UPS接电。 室外设备箱如图&#xff1a; 施工方从UPS接电后&#xff0c;直接接接线板&#xff0c;从接线板接两个220V-24V海康监控电源&#xff0c;电…

MySQL8高级

MySQL8高级 一、Linux下MySQL的安装与使用 1、版本说明 MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;自由下载&#xff0c;但不提供官方技术支持&#xff0c;适用于大多数普通用户。MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;不能…

软件测试基础-自动化测试技术

今天跟大家分享软件测试基础&#xff0c;自动化测试技术&#xff0c;主要从引入自动化测试的原因、自动化测试的定义、自动化测试的优势、自动化测试的劣势、自动化测试的工具五个方面来讲述。 01 引入自动化测试的原因 软件规模越来越大&#xff0c;用户对软件的质量要求越来…

基于PHP+MYSQL药店会员管理系统的设计与实现

药房会员管理系统是信息时代的产物,随着时代的发展,各大药店也与时俱进使用了各类现代化的系统来进行各类药品和会员信息的管理,甚至有些药店会给会员使用积分系统,根据用户的消费进行积分,然后用积分兑换一些差用的日常用品或者药品,从而增加会员的黏度。 PHP&#xff1a;MYSQ…

[SpringMVC1]简介与快速入门案例详解

文章目录 一、SpringMVC简介 1.概述 2.三大模块 二、SpringMVC快速入门 1.准备工作 &#xff08;1&#xff09;新建Maven项目&#xff0c;选择webapp模板 &#xff08;2&#xff09;新增java源文件包 2.开始配置SpringMVC (1)在pom.xml中导入相关坐标以下载需要用到的依赖…

[附源码]计算机毕业设计JAVA鞋店销售管理

[附源码]计算机毕业设计JAVA鞋店销售管理 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

SpringBoot旅游网源码和论文java旅游管理系统

随着人们生活水平的不断提升&#xff0c;人们对旅游的需求越来越旺盛&#xff0c;对旅游产品 和服务的质量要求也越来越高。伴随着计算机技术、网络技术的不断普及与应用&#xff0c; 人们通过网络浏览旅游信息&#xff0c;预订旅游产品&#xff0c;交流旅游体验的活动越来越多…