分布式事务落地:Seata AT 模式 vs TCC 模式,在订单与库存扣减场景下的艰难抉择

标签:#Seata #分布式事务 #微服务 #SpringCloud #架构设计 #Java


💣 前言:微服务拆分后的“噩梦”

假设一个电商下单流程:

  1. 订单服务:创建订单 (INSERT ORDER).
  2. 库存服务:扣减库存 (UPDATE STOCK SET count = count - 1).

如果没有分布式事务,当库存扣减成功,但网络超时导致订单服务回滚时,库存就永久丢失了(超卖/少卖)。


🤖 一、 Seata AT 模式:黑科技般的“时光倒流”

AT (Automatic Transaction)模式是 Seata 的默认模式,主打“无侵入”。你依然像写本地事务一样写代码,Seata 在底层帮你搞定一切。

1. 原理核心:Undo Log

Seata 会代理 JDBC 数据源。当你执行 SQL 时,Seata 会拦截:

  • 第一阶段 (Prepare)
  1. 解析 SQL,查询更新前的数据(Before Image)。
  2. 执行 SQL,查询更新后的数据(After Image)。
  3. 把 Before/After Image 存入undo_log表。
  4. 提交本地事务。
  • 第二阶段 (Commit/Rollback)
  • Commit:异步删除undo_log
  • Rollback:根据undo_log中的 Before Image,生成反向 SQL 把数据改回去。

AT 模式流程图 (Mermaid):

1. 开启全局事务
2. 调用业务
2. 调用业务
3. 报告状态
4. 决议: 全局提交/回滚

AT 模式内部逻辑

拦截

查询快照

保存

业务 SQL

Seata DataSource Proxy

生成 Before/After Image

undo_log 表

提交本地事务

TM 事务管理器

TC 事务协调者

RM 订单服务

RM 库存服务

2. 代码实战

代码极其简单,只需要在发起方加上@GlobalTransactional

// 订单服务@GlobalTransactional(name="create-order-tx",rollbackFor=Exception.class)publicvoidcreateOrder(StringuserId,StringcommodityCode,intcount){// 1. 本地逻辑:创建订单orderMapper.insert(newOrder(userId,commodityCode,count));// 2. 远程调用:扣减库存 (Feign)// 库存服务那边只需要普通的 @Transactional 即可storageClient.deduct(commodityCode,count);}
3. 致命弱点:全局锁 (Global Lock)

为了防止脏写 (Dirty Write),Seata 在 AT 模式下需要获取全局锁
高并发热点商品扣减库存时,所有事务都要排队争抢同一行记录的全局锁。
结论:AT 模式不适合高并发抢购场景。


🛠️ 二、 Seata TCC 模式:硬核的“资源预留”

TCC (Try-Confirm-Cancel)模式不依赖数据库的 ACID,而是把逻辑上升到业务层。它要求开发者为每个操作实现三个方法。

1. 原理核心:资源预留
  • Try:资源检测和预留(冻结库存)。
  • Confirm:真正的业务提交(使用冻结的库存)。
  • Cancel:业务回滚(释放冻结的库存)。
2. 库存扣减的 TCC 设计

我们需要在数据库表中增加一个frozen(冻结) 字段。

  • Try 阶段
    UPDATE stock SET count = count - 1, frozen = frozen + 1 WHERE id = 1
    (库存没真扣,只是挪到了冻结区)
  • Confirm 阶段
    UPDATE stock SET frozen = frozen - 1 WHERE id = 1
    (真正的扣减,消耗冻结区)
  • Cancel 阶段
    UPDATE stock SET count = count + 1, frozen = frozen - 1 WHERE id = 1
    (回滚,把冻结区的库存还回去)

TCC 流程图 (Mermaid):

1. Try 阶段

成功

失败

2. Cancel 阶段 (回滚)

库存 Cancel: 解冻库存

2. Confirm 阶段 (提交)

库存 Confirm: 扣除冻结

TM

库存 Try: 冻结库存

3. 代码实战

代码量激增,需要定义接口。

// 定义 TCC 接口@LocalTCCpublicinterfaceStorageTccService{// Try: 返回 boolean 或 void,一定要加上 @TwoPhaseBusinessAction@TwoPhaseBusinessAction(name="deductStock",commitMethod="commit",rollbackMethod="rollback")booleantryDeduct(@BusinessActionContextParameter(paramName="code")StringcommodityCode,@BusinessActionContextParameter(paramName="count")intcount);// Confirmbooleancommit(BusinessActionContextcontext);// Cancelbooleanrollback(BusinessActionContextcontext);}
4. 核心优势:无锁高性能

TCC 的锁在数据库行锁层面(本地事务短),没有全局锁。Try 阶段虽然锁了行,但提交极快。
更厉害的是:TCC 不依赖数据库!你甚至可以用 Redis 来做库存扣减(Try 在 Redis 冻结,Confirm 在 Redis 删除)。


⚔️ 三、 AT vs TCC:巅峰对决

维度AT 模式 (自动)TCC 模式 (手动)
代码侵入性极低(注解即可)极高(写3个方法)
开发效率
性能中 (受限于全局锁)(无全局锁)
适用场景后台管理、低并发业务核心交易、高并发、Redis/非DB资源
复杂性依赖 undo_log 表需处理空回滚、悬挂、幂等

🧠 四、 艰难抉择:到底选谁?

回到我们的场景:订单与库存

1. 场景 A:普通的 B2B 采购系统 (QPS < 100)

选择:AT 模式
原因:开发快,维护简单,并发低,全局锁不会成为瓶颈。没必要为了那一丢丢性能去写复杂的 TCC。

2. 场景 B:双十一大促 / 直播带货 (QPS > 1000)

选择:TCC 模式(甚至结合 Redis)。
原因:AT 模式的全局锁会导致大量事务等待,拖垮数据库。TCC 允许你在 Try 阶段预占用资源,且优化空间极大(例如将库存放入 Redis 做 TCC)。


🎯 总结

  • 能用 AT 就用 AT,毕竟“懒”是程序员的美德。
  • 性能瓶颈上 TCC,这是架构师能力的体现。
  • TCC 的三个坑:一定要注意处理空回滚(未 Try 先 Cancel)、幂等(多次 Cancel)、悬挂(Cancel 比 Try 先到)。

Next Step:
如果你的业务并发极高,TCC 都嫌慢,那就只能上RocketMQ 事务消息了。那是“最终一致性”的领域,虽然不再保证强一致,但能获得极致的吞吐量。建议去了解一下 RocketMQ 的Half Message机制。

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

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

相关文章

热设计知识库:整合行业标准、材料参数、案例库,提供智能设计建议。

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 &#x1f48c;公众号&#xff1a;莱歌数字&#xff08;B站同名&#xff09; &#x1f4f1;个人微信&#xff1a;yanshanYH 211、985硕士&#xff0c;从业16年 从…

完成比完美更重要:敏捷热管理方法

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 &#x1f48c;公众号&#xff1a;莱歌数字&#xff08;B站同名&#xff09; &#x1f4f1;个人微信&#xff1a;yanshanYH 211、985硕士&#xff0c;从业16年 从…

【tensorRT从零起步高性能部署】18-TensorRT基础-核心流程全面剖析(通俗易懂)

用通俗易懂的大白话&#xff0c;拆解TensorRT的核心组件、类/函数的作用和使用逻辑——其实TensorRT的整个流程&#xff0c;就像**“定制一个专属GPU的高速计算器”**&#xff1a;先画图纸、再优化造机器、最后用机器干活。下面我用“生活化比喻通俗步骤”&#xff0c;把所有核…

当你遇到裁员,你该如何面对呢?

裁员过后&#xff0c;肯定是几家欢喜几家愁&#xff0c;但太阳还是会照常升起&#xff0c;无论是那些留下来的“幸运儿”还是被裁减的“倒霉蛋”都需要面对今后的工作与生活。那么&#xff0c;该如何面对未来呢&#xff1f;01从容面对如果你是因为企业经营结构或战略调整而被裁…

‌AI驱动的崩溃模块预测:软件测试从业者实战指南

高风险模块的AI预测已成测试效能跃迁的关键引擎‌在2026年的软件交付节奏下&#xff0c;‌基于历史缺陷数据的AI预测模型&#xff0c;已从研究概念演变为测试团队的标配能力‌。通过融合代码变更频率、历史缺陷密度、圈复杂度与测试覆盖率四大核心特征&#xff0c;结合XGBoost、…

为什么你的自动化测试失败率居高不下?可能是AI训练数据错了

自动化测试失败率的隐忧 在快速迭代的软件开发中&#xff0c;自动化测试已成为质量保障的基石。然而&#xff0c;许多团队报告其失败率持续居高不下——据行业调研&#xff08;如Gartner 2025报告&#xff09;&#xff0c;超过60%的企业面临自动化测试脚本频繁报错的问题&…

dpwsockx.dll文件丢失怎么办? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

“发票未付,服务将停”:意大利主机商客户成钓鱼新目标,域名与网站控制权正被悄然转移

在数字世界里&#xff0c;一个域名可能只值几十元&#xff0c;但对一家中小企业而言&#xff0c;它可能是品牌、客户流量、甚至全部营收的唯一入口。正因如此&#xff0c;当一封标题为“您的 Aruba 账户存在未支付发票&#xff0c;服务将于24小时内暂停”的邮件出现在收件箱时&…

2026 MBA必看!8个降AI率工具测评榜单

2026 MBA必看&#xff01;8个降AI率工具测评榜单 2026年MBA必备的降AI率工具测评指南 随着学术规范日益严格&#xff0c;AIGC检测技术不断升级&#xff0c;传统的降重方式已难以满足需求。对于MBA学生而言&#xff0c;论文不仅是学术成果的体现&#xff0c;更是职业发展的重要筹…

钓鱼邮件新变种:利用HTML表格伪造二维码绕过安全检测

随着网络安全防护体系的不断演进&#xff0c;攻击者也在持续寻找新的技术路径规避检测机制。近日&#xff0c;一种新型钓鱼邮件攻击手法在国际安全社区引发广泛关注&#xff1a;攻击者不再使用传统的图片嵌入方式生成二维码&#xff0c;而是通过纯HTML表格结构“绘制”出视觉上…

NXP解析蓝牙 ® 声道探测技术将如何赋能汽车数字钥匙

汽车领域对该技术的期待颇高 —— 不仅看重其高精度测距能力&#xff0c;也关注其安全增强特性&#xff0c;目前行业组织已在推进将其应用于数字钥匙标准。恩智浦日本微控制器部门的 Kuniyuki Tomizu&#xff08;参与蓝牙低功耗营销工作&#xff09;&#xff0c;重点介绍了蓝牙…

2026必备!10个AI论文软件,助研究生轻松搞定论文写作!

2026必备&#xff01;10个AI论文软件&#xff0c;助研究生轻松搞定论文写作&#xff01; AI 工具革新论文写作&#xff0c;研究生迎来高效新纪元 在学术研究日益精细化的今天&#xff0c;研究生们正面临前所未有的挑战。从选题构思到论文撰写&#xff0c;再到查重降重&#xff…

AI英语口语教练APP的费用

开发一款AI英语口语教练APP的费用&#xff0c;通常由人力开发成本&#xff08;前期投入&#xff09;和AI云服务成本&#xff08;长期运营&#xff09;两大部分组成。在2026年的市场环境下&#xff0c;根据应用复杂程度的不同&#xff0c;预估费用如下。一、 核心开发阶段费用&a…

借助蓝牙 ® 随机解析私有地址(RPA)更新,提升设备隐私性与能效表现

蓝牙 随机 RPA 更新功能&#xff0c;增强了对 “可解析私有地址” 的管理能力&#xff0c;同时提升了蓝牙 LE 设备的隐私性与能效表现。本文将说明蓝牙 随机 RPA 更新的重要性、工作原理&#xff0c;并为刚接触这一蓝牙增强功能的读者提供实用背景信息。 背景 所有蓝牙设备都…

【2026】 LLM 大模型系统学习指南 (3)

Judge Boi&#xff1a;大模型的 “智能阅卷老师”—— 从原理到实用操作在和大模型打交道时&#xff0c;我们常遇到一个问题&#xff1a;AI 生成的回答到底好不好&#xff1f;比如让 AI 解数学题、写作文&#xff0c;或是生成编程代码&#xff0c;怎么快速判断它的输出是否准确…

Springboot旅游景点管理系统2fj40iq6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能用户&#xff0c;景点分类&#xff0c;路线分类&#xff0c;车票分类&#xff0c;景点信息&#xff0c;酒店信息&#xff0c;游玩路线&#xff0c;车票信息&#xff0c;门票订单&#xff0c;酒店订单&#xff0c;车票订单&#xff0c;留言反馈开题报告…

链表实现超详细讲解:从概念到代码手把手教你

链表是一种基础且重要的数据结构&#xff0c;它通过节点间的指针链接来组织数据&#xff0c;与数组的连续存储方式形成鲜明对比。理解链表的实现原理&#xff0c;是掌握动态数据管理、深入学习更复杂结构&#xff08;如树、图&#xff09;的关键一步。本文将从基本概念出发&…

paperxie 论文查重:每日 200 篇免费额度,重塑学术检测性价比标杆

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/checkhttps://www.paperxie.cn/check 在学术写作的最后一道关卡前&#xff0c;论文查重始终是绕不开的核心环节。无论是本科生的毕业论文、研究生的课题研究&#xff0c;还…

基于SpringAI的在线考试系统-数据库 表结构 完整外键依赖关系梳理

exam_system_ai 数据库 表结构 & 完整外键依赖关系梳理 整体说明 该库是考试系统AI&#xff08;在线考试智能阅卷评分&#xff09; 专用MySQL库&#xff0c;共包含26张业务表 3个统计视图&#xff0c;所有表的编码均为utf8mb4&#xff0c;主键均为自增ID&#xff1b; 表之…