Seata分布式事务:跨服务数据一致性保障
Seata分布式事务跨服务数据一致性保障下单扣了库存余额也扣了结果订单创建失败——钱没了货也没了用户炸了。分布式事务就是来处理这种要么全成功、要么全回滚的跨服务烂摊子的。一、分布式事务是怎么产生的单体应用时代订单、库存、支付全在一个数据库里一个Transactional搞定一切。微服务化后下单流程跨3个服务、3个数据库 order-service product-service account-service ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │ 创建订单 │ ──→ │ 扣减库存 │ ──→│ 扣减余额 │ │ (DB-A) │ │ (DB-B) │ │ (DB-C) │ └──────────┘ └──────────────┘ └──────────────┘ ↓ ✅ ↓ ✅ ↓ ❌ 失败 结果订单创建了库存扣了余额没扣——数据不一致传统事务Transactional管不了跨 JVM、跨数据库的操作这就是分布式事务要解决的问题。二、理论基础CAP 和 BASE2.1 CAP 理论CAP 是分布式系统的铁律一致性Consistency、可用性Availability、分区容错Partition Tolerance三者最多同时满足两个。选择说明举例CP保证一致性分区容错牺牲可用性ZooKeeper、etcdAP保证可用性分区容错牺牲一致性Eureka、CassandraCA理想状态但网络分区无法避免单机系统网络分区Partition在生产环境几乎无法避免——交换机故障、网线松了、机房断网都是分区。所以分布式系统实际上是在 CP 和 AP 之间做选择。2.2 BASE 理论既然 CAP 注定无法三全就退而求其次——BASE 理论是 CAP 在工程上的妥协BABasically Available基本可用允许响应时间变慢或部分功能降级SSoft State软状态允许系统存在中间状态数据不一致的窗口期EEventually Consistent最终一致性不要求实时一致但保证最终会一致Seata 的 AT 模式就是 BASE 理论的典型实践——它不保证实时一致性但通过补偿机制保证最终一致性。三、分布式事务方案概览方案原理一致性性能侵入性2PC两阶段提交协调者统一表决强一致低高TCCTry-Confirm-Cancel 三阶段最终一致中高需手动编码Saga长事务拆分正向调用补偿最终一致高中本地消息表本地事务 消息表保证投递最终一致高低Seata AT自动生成 undo_log 补偿最终一致中极低四、Seata 架构三剑客SeataSimple Extensible Autonomous Transaction Architecture是阿里开源的一款分布式事务中间件。┌─────────────────────────────────────────────────────┐ │ Seata 架构 │ │ │ │ ┌──────────┐ ①开启全局事务 ┌──────────────┐ │ │ │ TM │ ─────────────────→ │ TC │ │ │ │ 事务管理器 │ │ 事务协调器 │ │ │ │(order服务)│ ←────── ③提交/回滚 │ (Seata Server)│ │ │ └──────────┘ └──────────────┘ │ │ │ ↑ ↑ │ │ ②注册分支事务 ②注册 ↑ ↑ ② │ │ │ ┌──────┐ ┌──────┐│ │ ┌────▼────┐ │ RM │ │ RM ││ │ │ RM │ ←── ⑤一阶段提交 ──→ │(库存) │ │(账户) ││ │ │ (订单) │ └──────┘ └──────┘│ │ └─────────┘ │ └─────────────────────────────────────────────────────┘TCTransaction Coordinator事务协调器Seata Server独立部署管理全局事务状态决定提交还是回滚TMTransaction Manager事务管理器事务发起方负责开启、提交、回滚全局事务。通常在GlobalTransactional注解所在服务RMResource Manager资源管理器事务参与方管理分支事务上的资源数据库连接负责分支事务的提交和回滚五、AT 模式原理详解重点AT 模式是 Seata 最闪耀的功能——对业务代码零侵入你只需在方法上加一个GlobalTransactional剩下的自动搞定。5.1 一阶段拦截 SQL 记录 undo_log执行业务 SQLUPDATE product SET stock stock - 1 WHERE id 100 步骤 ① Seata 代理数据源拦截到这条 UPDATE ② 先查快照SELECT * FROM product WHERE id 100 得到 before image: { id: 100, stock: 50 } ③ 执行原来的 UPDATE ④ 再查快照SELECT * FROM product WHERE id 100 得到 after image: { id: 100, stock: 49 } ⑤ 将 before/after image 写入 undo_log 表 ⑥ 向 TC 注册分支事务告知我一阶段搞定了5.2 二阶段提交 or 回滚如果所有 RM 都成功了 → 二阶段提交TC 通知所有 RM「全局事务成功你们清理 undo_log 吧」 RM 收到提交指令 → 异步删除对应的 undo_log 记录 // 简单、轻量不会有性能问题如果任何 RM 失败 → 二阶段回滚TC 通知所有 RM「全局事务失败都给我回滚」 RM 收到回滚指令 ① 根据 undo_log 中的 after image 检查当前数据 如果数据被改了脏写→ 回滚失败需要人工介入 如果数据没变 → 继续 ② 用 before image 做反向 SQL UPDATE product SET stock 50 WHERE id 100 ③ 删除 undo_log 记录这就是 AT 模式的核心自动挡。你写普通 SQLSeata 在背后偷偷生成反向补偿 SQL。六、Docker 部署 Seata TC Serverversion:3services:seata-server:image:seataio/seata-server:1.7.0container_name:seata-serverports:-7091:7091# Web 控制台-8091:8091# 事务协调端口environment:-SEATA_PORT8091-STORE_MODEdb# 存储模式db 或 file-SEATA_IP192.168.1.100volumes:-./seata/resources:/seata-server/resources启动后访问http://localhost:7091可以看到 Seata 控制台。在application.yml中配置 Seata 注册到 Nacosseata:registry:type:nacosnacos:server-addr:127.0.0.1:8848namespace:group:SEATA_GROUPapplication:seata-serverconfig:type:nacosnacos:server-addr:127.0.0.1:8848namespace:group:SEATA_GROUP七、SpringBoot 整合 Seata AT 模式Step 1引入依赖dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependencyStep 2配置数据源代理seata:tx-service-group:my_tx_group# 事务分组名称service:vgroup-mapping:my_tx_group:default# 映射到 TC 集群data-source-proxy-mode:AT# AT 模式需要代理数据源Step 3undo_log 表每个参与分布式事务的数据库中都要建这张表CREATETABLEundo_log(idbigint(20)NOTNULLAUTO_INCREMENT,branch_idbigint(20)NOTNULLCOMMENT分支事务ID,xidvarchar(100)NOTNULLCOMMENT全局事务ID,contextvarchar(128)NOTNULL,rollback_infolongblobNOTNULLCOMMENTbefore/after image,log_statusint(11)NOTNULL,log_createddatetimeNOTNULL,log_modifieddatetimeNOTNULL,PRIMARYKEY(id),UNIQUEKEYux_undo_log(xid,branch_id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;Step 4业务代码ServicepublicclassOrderService{// 远程调用库存服务AutowiredprivateStockFeignClientstockClient;// 远程调用账户服务AutowiredprivateAccountFeignClientaccountClient;AutowiredprivateOrderMapperorderMapper;GlobalTransactional// ← 就这么一个注解publicvoidcreateOrder(OrderDTOdto,LonguserId){// 1. 创建订单本地事务 → 自动注册为全局事务的分支OrderordernewOrder();order.setUserId(userId);order.setProductId(dto.getProductId());order.setAmount(dto.getAmount());orderMapper.insert(order);// 2. 扣减库存Feign 远程调用 → 另一个分支事务stockClient.deduct(dto.getProductId(),dto.getQuantity());// 3. 扣减余额Feign 远程调用 → 又一个分支事务accountClient.deduct(userId,dto.getTotalPrice());// 如果第3步抛出异常Seata 会自动回滚 1 和 2 的操作}}就这么简单Seata 自动完成分布式事务的提交和回滚。八、TCC 模式简介AT 模式虽好但有些场景不适合——比如跨 Redis/MongoDB 操作Seata 拦不住非关系型数据库的 SQL。这时用 TCC 模式阶段方法职责TrytryDeduct()预留资源冻结库存ConfirmconfirmDeduct()使用预留资源真正扣库存CancelcancelDeduct()释放预留资源解冻库存TCC 需要手写三阶段代码比 AT 模式费劲但更灵活能处理异构数据源。九、常见问题脏写二阶段回滚时数据已被其他事务修改。Seata 用 after image 校验发现数据变了就抛异常此时需人工介入。悬挂Cancel 比 Try 先执行Try 超时后 TC 直接调 Cancel后来 Try 才到。TCC 模式下需设计空回滚逻辑——Cancel 操作发现没有对应 Try 记录时直接返回成功。空回滚Try 阶段失败TC 调用 Cancel但该分支事务从未成功执行过任何操作。Cancel 必须容错不能因为找不到记录就报错。总结Seata AT 模式让分布式事务的开发门槛降到最低——加一个GlobalTransactional、建一张undo_log表就能让跨服务的数据操作具有要么全成功、要么全回滚的能力。它基于 BASE 理论实现了最终一致性对 90% 的业务场景够用。遇到复杂场景再考虑 TCC 或 Saga。

相关新闻

AI Agent技术实现与行业应用实践

AI Agent技术实现与行业应用实践

1. AI Agent时代的商业范式转型过去十年间,我见证过上百家企业从传统软件销售向智能化服务转型的完整历程。2023年成为AI Agent技术爆发的分水岭,最显著的变化是:客户不再满足于购买功能固化的软件包,而是需要能够封装行业know-ho…

2026/10/16 21:48:10 阅读更多 →
CCS小金人调试难题:国产MCU开发环境稳定性解决方案

CCS小金人调试难题:国产MCU开发环境稳定性解决方案

最近在开发者社区和硬件圈子里,一个词频繁出现——“CCS小金人”。乍一听,你可能以为是某个游戏里的稀有道具,或是某个新潮的硬件品牌。但如果你深入了解一下,会发现它背后关联的,是一个让无数嵌入式开发者、硬件工程师…

2026/10/18 8:09:01 阅读更多 →
吴恩达Transformer课程:从自注意力到编码器-解码器完整实践指南

吴恩达Transformer课程:从自注意力到编码器-解码器完整实践指南

这次我们来看一个关于 Transformer 模型原理的深度讲解资源。这个资源的核心是吴恩达(Andrew Ng)在 DeepLearning.AI 平台上发布的最新课程内容,它并非一个需要本地部署的软件项目,而是一套高质量的教学视频与配套材料。对于任何希…

2026/10/19 8:42:19 阅读更多 →

最新新闻

NetCMD 2.6.5 发布:五厂商离线路由交换命令生成器(华为/华三/锐捷/迈普/思科)

NetCMD 2.6.5 发布:五厂商离线路由交换命令生成器(华为/华三/锐捷/迈普/思科)

NetCMD 2.6.5 发布:五厂商离线路由交换命令生成器(华为/华三/锐捷/迈普/思科) 网络工程师配交换机路由器,最磨人的不是不会配,是同一件事五家写法各一套:华为 int g0/0/1、华三 int g1/0/1、思科 int g0/1&…

2026/10/20 10:47:40 阅读更多 →
STM32F103驱动AD7124实战:从SPI时序到多通道高精度采集

STM32F103驱动AD7124实战:从SPI时序到多通道高精度采集

简介:这份资源是面向STM32F103平台、针对AD7124高精度ADC芯片的完整驱动代码工程,适合正在调试该芯片却苦于缺少参考的嵌入式开发者与新手。作者基于Keil5环境,采用模拟SPI方式实现通信,测试代码聚焦6通道、双极性、全功率采样并启…

2026/10/20 10:47:40 阅读更多 →
调出最佳回答:PIIP-LLaVA生成参数temperature与top_p调优技巧清单

调出最佳回答:PIIP-LLaVA生成参数temperature与top_p调优技巧清单

【免费下载链接】PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_7B 项目地址: https://ai.gitcode.com/OpenGVLab/PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_7B 点击查看 免费下载 PIIP-LLaVA_ConvNeXt-B_CLIP-L_1024-336_7B 是一款多模态视觉指令模型:它用 Con…

2026/10/20 10:47:40 阅读更多 →
3 步搞定 emuMMC 备份与恢复:Atmosphere 保姆级指南

3 步搞定 emuMMC 备份与恢复:Atmosphere 保姆级指南

3 步搞定 emuMMC 备份与恢复:Atmosphere 保姆级指南 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere 有没有遇到过误断电或系统更…

2026/10/20 10:47:40 阅读更多 →
MQTT实战 - QoS 0-1-2 到底怎么选?一张图看懂(四)

MQTT实战 - QoS 0-1-2 到底怎么选?一张图看懂(四)

我是做物联网后端的老兵,8 年 .NET 开发,现在带一支研发团队做 .NET AIoT 架构。这个系列讲我真实项目里踩过的坑——不是抄来的入门教程。 QoS 这三个字母,可能是 MQTT 里被误解最深的东西。新手要么一句「当然全选 QoS 2,最可靠…

2026/10/20 10:47:40 阅读更多 →
Django+Vue宠物商店实战:库存原子扣减、订单状态机与RBAC权限落地

Django+Vue宠物商店实战:库存原子扣减、订单状态机与RBAC权限落地

简介:这是一套基于PythonDjangoVue.js全栈技术实现的宠物商店管理系统源码,专为计算机相关专业本科生毕业设计与课程设计打造,已通过导师审核并获98.5分高分评价,适用于毕设选题参考、项目实战训练及期末大作业开发。资源包共396个…

2026/10/20 10:46:38 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →