SpringCloud Alibaba 之分布式全局事务 Seata 原理分析
1. 什么是 Seata?为什么需要它?
想象一下,你去银行转账:
- 操作1:从你的账户扣款 1000 元
- 操作2:向对方账户增加 1000 元
如果 操作1 成功,但 操作2 失败了,你的钱就凭空消失了!这就是典型的分布式事务问题。
在微服务架构中,不同服务可能在不同的数据库上操作,如何保证多个服务的操作要么全部成功,要么全部失败?Seata(Simple Extensible Autonomous Transaction Architecture) 就是为了解决这个问题而生的。
2. Seata 的核心概念(先理解,再读源码)
Seata 的核心思想是 “两阶段提交(2PC)”,但比传统 2PC 更轻量级。它的核心角色有:
- TC(Transaction Coordinator):事务协调者,负责全局事务的提交或回滚(Seata-Server)。
- TM(Transaction Manager):事务管理者(通常是业务入口方法),负责开启/提交/回滚全局事务。
- RM(Resource Manager):资源管理者(各个微服务),负责管理本地事务,并向 TC 汇报状态。
举个栗子🌰:
- TM 是银行柜员,负责发起转账事务。
- RM1 是你的账户服务,RM2 是对方账户服务。
- TC 是银行总部,决定最终是转账成功还是回滚。
3. Seata 的工作流程(源码核心逻辑)
Seata 的全局事务分为两个阶段:
阶段1:执行本地事务(RM 干活)
- TM 向 TC 申请开启全局事务(
GlobalBeginRequest)。 - TC 生成全局事务 ID(XID),并返回给 TM。
- TM 调用 RM1(你的账户扣款),RM1 执行本地事务,但不提交,而是记录 undo_log(用于回滚)。
- RM1 向 TC 注册分支事务,并汇报状态(
BranchRegisterRequest)。 - TM 调用 RM2(对方账户加钱),同样记录 undo_log,但不提交。
- RM2 也向 TC 注册分支事务。
👉 核心源码:
GlobalTransactionScanner(TM 入口)DefaultCoordinator(TC 处理事务注册)DataSourceProxy(RM 代理数据源,拦截 SQL 生成 undo_log)
阶段2:全局提交或回滚(TC 决策)
- 如果所有 RM 都成功:
- TC 发送
GlobalCommitRequest,RM 提交本地事务。
- TC 发送
- 如果有 RM 失败:
- TC 发送
GlobalRollbackRequest,RM 根据 undo_log 回滚数据。
- TC 发送
👉 核心源码:
DefaultCore(TC 决策逻辑)AsyncWorker(异步执行提交/回滚)UndoLogManager(RM 回滚时解析 undo_log 恢复数据)
4. Seata 如何保证数据一致性?(关键设计)
(1)undo_log 机制(回滚的关键)
- 在阶段1,RM 会记录修改前的数据快照(
undo_log)。 - 如果 TC 通知回滚,RM 会根据
undo_log恢复数据。
源码关键类:UndoLogManager
(2)AT 模式(默认模式,自动补偿)
- 自动生成反向 SQL(如
UPDATE account SET money = money - 100的回滚 SQL 是UPDATE account SET money = money + 100)。 - 依赖数据库本地事务,确保
undo_log和业务 SQL 在同一个事务里。
源码关键类:SQLVisitorFactory(解析 SQL 生成回滚语句)
(3)全局锁(防止脏写)
- 在阶段1,RM 会申请全局锁,防止其他事务修改相同数据。
- 如果拿不到锁,事务会失败,避免数据不一致。
源码关键类:GlobalLockTemplate
5. 总结(Seata 的优缺点)
优点:
✅ 对业务代码侵入小(只需加 @GlobalTransactional 注解)。
✅ 支持多种模式(AT、TCC、SAGA、XA)。
✅ 高性能(相比传统 2PC,减少了阻塞时间)。
缺点:
❌ 依赖 TC(Seata-Server),TC 单点故障会影响整个系统(可集群部署)。
❌ AT 模式有幻读问题(高并发场景下可能读到中间状态)。
6. 进阶思考(如何优化 Seata?)
- TC 高可用:部署 Seata-Server 集群 + 数据库 HA。
- 混合模式:核心业务用 TCC(更强一致性),普通业务用 AT(更高性能)。
- 结合消息队列:用 RocketMQ 事务消息做最终一致性补偿。
🚀 现在,你对 Seata 的源码是不是有了清晰的认识?
💡 动手实践: 搭建一个 Seata Demo,Debug 跟踪 XID 传递和 undo_log 生成,理解会更深刻!
如果有疑问,欢迎留言讨论!🎯
推荐阅读文章
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
什么是 Cookie?简单介绍与使用方法
-
什么是 Session?如何应用?
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
如何理解应用 Java 多线程与并发编程?
-
把握Java泛型的艺术:协变、逆变与不可变性一网打尽
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
如何理解线程安全这个概念?
-
理解 Java 桥接方法
-
Spring 整合嵌入式 Tomcat 容器
-
Tomcat 如何加载 SpringMVC 组件
-
“在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
-
“避免序列化灾难:掌握实现 Serializable 的真相!(二)”
-
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
-
解密 Redis:如何通过 IO 多路复用征服高并发挑战!
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
-
Java 中消除 If-else 技巧总结
-
线程池的核心参数配置(仅供参考)
-
【人工智能】聊聊Transformer,深度学习的一股清流(13)
-
Java 枚举的几个常用技巧,你可以试着用用
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)
-
为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)
相关文章:
SpringCloud Alibaba 之分布式全局事务 Seata 原理分析
1. 什么是 Seata?为什么需要它? 想象一下,你去银行转账: 操作1:从你的账户扣款 1000 元操作2:向对方账户增加 1000 元 如果 操作1 成功,但 操作2 失败了,你的钱就凭空消失了&…...
作业帮前端面试题及参考答案 (100道面试题-上)
HTML5 的优势是什么? HTML5 作为 HTML 语言的新一代标准,具有众多显著优势,为现代网页开发带来了诸多便利与革新。 在语义化方面,HTML5 引入了大量具有明确语义的标签,如<header>、<nav>、<article>、<section>、<aside>、<footer>等…...
Large Language Model(LLM)的训练和微调
之前一个偏工程向的论文中了,但是当时对工程理论其实不算很了解,就来了解一下 工程流程 横轴叫智能追寻 竖轴上下文优化 Prompt不行的情况下加shot(提示),如果每次都要加提示,就可以试试知识库增强检索来给提示。 如果希望增强…...
统计销量前十的订单
传入参数: 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…...
AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理
AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理 在人工智能快速发展的今天,大语言模型(如GPT、BERT等)已经成为改变世界的重要技术。但对于很多人来说,理解这些模型的工作原理仍然是一个挑战。为了帮助更多…...
MCP 认证考试常见技术难题实战分析与解决方案
MCP(Microsoft Certified Professional)认证考试在全球范围内被广泛认可,是衡量个人在微软技术领域专业能力的重要标准。然而,在备考和参加 MCP 认证考试过程中,考生常常会遇到各种技术难题。以下将对一些常见技术难题进行实战分析,并提供相应的解决方案。 一、网络配…...
qt designer 创建窗体选择哪种屏幕大小
1. 新建窗体时选择QVGA还是VGA 下面这个图展示了区别 这里我还是选择默认,因为没有特殊需求,只是在PC端使用...
Spark-SQL核心编程(一)
一、Spark-SQL 基础概念 1.定义与起源:Spark SQL 是 Spark 用于结构化数据处理的模块,前身是 Shark。Shark 基于 Hive 开发,提升了 SQL-on-Hadoop 的性能,但因对 Hive 依赖过多限制了 Spark 发展,后被 SparkSQL 取代&…...
Android WiFi获取动态IP地址
Android开发中获取WiFi动态IP地址可通过以下方法实现,需结合网络状态管理和API调用: 一、权限配置 在AndroidManifest.xml中添加必要权限: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <…...
正则表达式使用知识(日常翻阅)
正则表达式使用 一、字符匹配 1. 普通字符 描述:直接匹配字符本身。示例: abc 匹配字符串中的 “abc”。Hello 匹配字符串中的 “Hello”。 2. 特殊字符 .(点号): 描述:匹配任意单个字符(…...
AI与无人驾驶汽车:如何通过机器学习提升自动驾驶系统的安全性?
引言 想象一下,在高速公路上,一辆无人驾驶汽车正平稳行驶。突然,前方的车辆紧急刹车,而旁边车道有一辆摩托车正快速接近。在这千钧一发的瞬间,自动驾驶系统迅速分析路况,判断最安全的避险方案,精…...
第5篇:Linux程序访问控制FPGA端LEDR<三>
Q:如何具体设计.c程序代码访问控制FPGA端外设? A:以控制DE1-SoC开发板的LEDR为例的Linux .C程序代码。头文件fcntl.h和sys/mman.h用于使用/dev/mem文件,以及mmap和munmap内核函数;address_map_arm.h指定了DE1-SoC_Com…...
城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同
一、方案背景 1)项目背景 在当今数字化时代,随着信息技术的飞速发展,视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所,高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…...
主流程序员接单平台的分类整理与分析
一、主流推荐平台 1.程序员客栈 特点:国内知名度高,需求池模式自动匹配项目,项目经理介入协调争议,流程规范。 优势:适合新手到资深开发者,资金托管安全性高,交易纠纷处理专业。 不足&…...
【笔记ing】AI大模型-03深度学习基础理论
神经网络:A neural network is a network or circuit of neurons,or in a modern sense,an artificial neural network,composed of artificial neurons or nodes.神经网络是神经元的网络或回路,或者在现在意义上来说,是一个由人工神经元或节…...
Hutool工具包中`copyProperties`和`toBean`的区别
前言 在Java开发中,对象转换是一项常见且重要的操作。Hutool作为一个功能强大的Java工具包,提供了copyProperties和toBean这两个实用的方法来帮助我们进行对象转换。然而,很多开发者对这两个方法的区别和使用场景并不十分清楚。 一、Hutool…...
高德地图 JS-SDK 实现教程
高德地图 JS-SDK 实现教程:定位、地图选点、地址解析等 适用地点选择、地址显示、表单填写等场景,全面支持移动端、手机浏览器和 PC端环境 一、创建应用&Key 前端(JS-SDK、地图组件) 登陆 高德开放平台创建应用,…...
07软件测试需求分析案例-修改用户信息
修改用户信息是后台管理菜单的一个功能模块,只有admin才有修改权限。包括查询用户名进行显示用户相关信息,并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务…...
分层对象模型:PO、DTO、VO、BO定义区别与使用场景
目录 前言 PO(持久化对象) DTO(数据传输对象) VO(视图对象) BO(业务对象) 关键区别总结 典型应用场景 为什么要分层设计 工具支持 前言 在开发中,我们经常遇到…...
设计模式 --- 状态模式
状态模式是一种行为型设计模式,允许对象在内部状态改变时动态改变其行为,使对象的行为看起来像是改变了。该模式通过将状态逻辑拆分为独立类,消除复杂的条件分支语句,提升代码的可维护性和扩展性。 状态模式的…...
Java多态课堂练习题
Java多态课堂练习题 题目:动物乐园的多态展示 背景设定: 设计一个动物乐园程序,展示不同类型动物的行为特点,要求使用多态特性实现。 1. 基础类设计(已给出部分代码) // 基类:动物 abstract…...
SAP系统中的借货
问题:什么是借贷? 解答:记账符号反映的是各种经济业务数量的增加和减少。 二:怎么区分借贷增减? 解答:“借”和“贷”何时为增加、何时为减少,必须结合账户的具体性质才能准确说明…...
深入剖析Go Channel:从底层原理到高阶避坑指南|Go语言进阶(5)
文章目录 引言channel的底层数据结构channel操作原理发送操作(ch <- data)接收操作(<-ch) 常见陷阱及避坑指南1. 死锁问题2. 关闭channel的错误方式3. 内存泄漏4. nil channel特性5. 性能考量 最佳实践总结 引言 Channel是Go语言实现CSP并发模型的核心机制,提…...
OpenCV 图形API(31)图像滤波-----3x3 腐蚀操作函数erode3x3()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用3x3矩形结构元素腐蚀图像。 该函数通过使用中心作为锚点的3x3矩形结构元素来腐蚀源图像。腐蚀操作可以应用多次(迭代࿰…...
5.5 GitHub数据秒级分析核心揭秘:三层提示工程架构设计解析
GitHub Sentinel Agent 分析报告功能设计与实现 关键词:GitHub 数据分析, 提示工程设计, Pull Request 分析, Issues 跟踪, 竞品对比 项目进展报告生成功能设计 报告生成模块是 GitHub Sentinel 的核心功能,通过三层嵌套式提示工程架构实现深度分析: #mermaid-svg-vdHRUan…...
【Java学习笔记】Java初级阶段代码规范
Java 初级阶段代码规范 1. 类、方法的注释,要以 javadoc 的方式来写。 2. 非 Java Doc 的注释,往往是给代码的维护者看的,着重告读者为什么这样写,如何修改,注重什么问题等 3. 使用 tab 操作,实现缩进&am…...
AI Agent开发大全第二十八课-MCP实现本地命令调用怎么做的?
开篇 MCP很强大,Client端一旦实现了稳定的连接和执行流程后任Server端随意改动都可兼容,这就是热插拨功能。 如果我们仅仅满足于MCP查点网上资料、读点图片即文字型的功能肯定是不能充分发挥MCP的强大之处的,正应了Google以及Anthropic最近的研究报告上说的:不要再在chat…...
macOS 上使用 Homebrew 安装和配置 frp 客户端
macOS 上使用 Homebrew 安装和配置 frp 客户端 (frpc) 指南 frp (Fast Reverse Proxy) 是一款高性能的反向代理应用,常用于内网穿透。本文将介绍在 macOS 上使用 Homebrew 安装 frpc,并进行配置和管理。 一、安装 frpc 使用 Homebrew 安装(…...
为 docker 拉取镜像配置代理
为 Docker 配置代理,有 两个层面 的操作:(1) Docker 守护进程(用于拉取镜像等操作),(2) Docker 容器内部(容器内应用的网络流量)。 我们这篇文章着重于前者,以下是详细步骤ÿ…...
A2A协议实现详解及示例
A2A协议概述 A2A (Agent2Agent) 是Google推出的一个开放协议,旨在使AI智能体能够安全地相互通信和协作。该协议打破了孤立智能体系统之间的壁垒,实现了复杂的跨应用自动化。[1] A2A协议的核心目标是让不同的AI代理能够相互通信、安全地交换信息以及在各…...
