支付系统的分布式事务:两阶段提交与 TCC 的落地对比
支付系统的分布式事务两阶段提交与 TCC 的落地对比一、一笔支付背后可能涉及三个服务、两个数据库和一个第三方在电商支付链路中一笔典型的支付操作涉及以下步骤扣减用户账户余额、创建支付订单、调用第三方支付渠道、增加商家收款记录。这四个步骤发生在三个不同的服务里账户服务、订单服务、支付网关各自的数据库是独立的。如果这四个步骤在一个单体数据库事务中BEGIN→ 执行四个操作 →COMMIT一致性由数据库保障。但在微服务架构下这四个步骤跨了三个数据库传统的事务语义失效了。扣减余额成功了但创建订单失败了——用户的余额少了商家也没收到钱。这就是分布式事务要解决的核心问题。二、两阶段提交的机制与致命缺陷两阶段提交2PC是分布式事务最经典的理论方案但也是生产环境中最少直接使用的方案。第一阶段投票阶段协调者向所有参与者发送准备提交请求。每个参与者在本地执行事务逻辑但不提交然后返回就绪或中止。第二阶段提交阶段如果所有参与者都返回就绪协调者发送提交请求所有人正式提交。如果有一个参与者返回中止协调者发送回滚请求。2PC 的核心问题是同步阻塞。在第一阶段完成后所有参与者都必须保持事务打开状态等待协调者的第二阶段指令。如果协调者宕机了参与者就会一直等待——锁资源数据库行锁、连接等全部被挂起的事务持有其他请求无法访问这些数据。这就是所谓的阻塞协议的代价。2PC 还有一个单点故障问题。协调者是整个协议的核心如果它在第二阶段发送指令时宕机部分参与者收到了提交请求另一些没收到——数据就不一致了。三、TCC 的补偿机制TCCTry-Confirm-Cancel是 2PC 的一种工程化改良引入了补偿的概念。Try 阶段预留资源。不真正执行扣减而是冻结或预占。比如冻结账户余额可用余额减少冻结金额增加创建状态为待确认的订单。Confirm 阶段所有参与者 Try 成功后执行真正提交。把冻结金额转为实际扣款把订单状态改为已支付。Cancel 阶段任一参与者 Try 失败后所有参与者回退 Try 操作。解冻余额取消订单。TCC 相比 2PC 的核心改进是Try 阶段不持有长时间锁。资源预留如冻结余额是一个状态变更不需要数据库事务一直挂起等待。即使 Confirm 阶段的服务宕机了也可以通过定时任务扫描待确认状态的记录重新执行 Confirm。/** * TCC 分布式事务的转账实现 * * 场景从账户 A 转账 100 元到账户 B * * 为什么 TCC 比 2PC 更实用 * 1. Try 阶段不持有锁只做资源预留 * 2. Confirm/Cancel 都是幂等操作可重试 * 3. 有明确的补偿路径Cancel 回退 Try */ public class TccTransferService { /** * Try 阶段尝试预留资源 * * 原则只预留不真正扣减 */ public boolean tryTransfer(String fromAccount, String toAccount, int amount, String tccId) { // 冻结转出方余额 // INSERT INTO frozen_record(tcc_id, account, amount) VALUES(...) // UPDATE account SET available available - amount WHERE ... // 约束available 0防止超额冻结 boolean frozen accountService.freeze(fromAccount, amount, tccId); if (!frozen) { return false; // 余额不足Try 失败 } // 创建待确认的转账记录 transferDao.insertPendingTransfer(tccId, fromAccount, toAccount, amount); return true; } /** * Confirm 阶段确认提交 * * 原则必须是幂等的可能被重试多次 */ public void confirmTransfer(String tccId) { TransferRecord record transferDao.getByTccId(tccId); if (record null || CONFIRMED.equals(record.getStatus())) { return; // 幂等已确认的跳过 } // 解冻 → 真正扣款 accountService.confirmFreeze(record.getFromAccount(), record.getAmount(), tccId); // 增加收款方余额 accountService.credit(record.getToAccount(), record.getAmount()); // 更新记录状态 transferDao.updateStatus(tccId, CONFIRMED); } /** * Cancel 阶段回滚 * * 原则必须是幂等的补偿 Try 阶段的所有操作 */ public void cancelTransfer(String tccId) { TransferRecord record transferDao.getByTccId(tccId); if (record null || CANCELLED.equals(record.getStatus())) { return; // 幂等已取消的跳过 } // 解冻余额 accountService.unfreeze(record.getFromAccount(), record.getAmount(), tccId); // 更新记录状态 transferDao.updateStatus(tccId, CANCELLED); } }四、TCC 的实践难点TCC 理论上是优雅的但实践中三个难点。业务逻辑的侵入性在单体应用的简单转账逻辑中只有一行余额 A 减 100余额 B 加 100。但在 TCC 模式下需要把这个逻辑拆成 Try冻结余额 A、Confirm真正扣 A 加 B、Cancel解冻 A三个方法。代码量翻了 3 倍。空回滚Cancel 可能在 Try 之前被调用比如 Try 请求超时协调者以为失败了就调了 Cancel但 Try 其实还没执行。Cancel 方法需要能处理没冻结但收到解冻请求的情况。幂等设计Confirm 和 Cancel 都可能被重试。必须在数据库层面设计好幂等键用 tcc_id 作为唯一约束否则重复执行会出大问题。五、总结分布式事务没有银弹。2PC 理论完美但工程上难以落地同步阻塞、单点故障。TCC 是更实用的方案用补偿机制替代了同步等待每个阶段都是独立的、幂等的、可重试的操作。但 TCC 的侵入性很高——它要求业务模型在设计时就支持 Try-Confirm-Cancel 三段式。对于简单的场景用本地消息表实现最终一致性可能比 TCC 更合适。技术方案没有绝对的优劣只有和场景的匹配度。

相关新闻

职场文职增效方案|OpenClaw 本地自动化,5 分钟完成 Windows 11搭建

职场文职增效方案|OpenClaw 本地自动化,5 分钟完成 Windows 11搭建

🦞OpenClaw(小龙虾) Windows 11 一键部署实操教程|零代码・内置依赖・解压即用 📋适配系统说明 兼容 Windows 11 家庭版、专业版、正式版全系列版本 📌项目基础介绍 OpenClaw 是一款在开源社区中备受关注…

2026/10/9 14:29:08 阅读更多 →
AI 服务流量回放:用历史请求构建推理服务回归测试集

AI 服务流量回放:用历史请求构建推理服务回归测试集

AI 服务流量回放:用历史请求构建推理服务回归测试集 一、你的推理服务升级了新模型,测试集准确率涨了,线上用户投诉翻了倍 推理服务的回归测试有一个独特的难题:测试集的分布和真实流量的分布经常不一致。你的测试集覆盖了 100 类…

2026/10/9 14:28:25 阅读更多 →
AI办公效率工具TOP10实战评测:从文档生成到会议纪要,92%的职场人还不知道的提效黑科技

AI办公效率工具TOP10实战评测:从文档生成到会议纪要,92%的职场人还不知道的提效黑科技

更多请点击: https://codechina.net 第一章:AI办公效率工具TOP10全景概览 AI正深度重塑现代办公范式,从智能文档处理到跨平台协同决策,一批兼具实用性、集成性与安全性的工具脱颖而出。本章不以主观评分排序,而是基于…

2026/10/12 10:30:21 阅读更多 →

最新新闻

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

简介:这是一份数据库课程设计完整参考项目——某商店进销存管理系统,面向计算机类专业学生、数据库初学者及需要完成课设的开发者,用于解决数据库原理课程设计中从系统分析到数据库实现的全流程问题。资源为RAR压缩包,共3个文件&a…

2026/10/13 5:38:34 阅读更多 →
轻量级任务流引擎 rea:把重复操作变成一条命令行流水线

轻量级任务流引擎 rea:把重复操作变成一条命令行流水线

周五下午,我盯着屏幕上那个快要跑完的批处理任务,心里很清楚:今天这已经是第七次重复同样的操作了。从压缩日志、生成报表、按规则归档,到清理临时目录、把结果文件挪到共享目录,每一步单独看都不复杂,合在…

2026/10/13 5:38:34 阅读更多 →
Spring Boot集成AI对话接口:从零搭建HR政策问答机器人

Spring Boot集成AI对话接口:从零搭建HR政策问答机器人

1. 项目定位:为什么是 Spring Boot AI 对话接口1.1 HR 政策问答机器人的核心需求拆解这个项目叫“AI全栈12-02”,名字里已经透露出完整的信息:它属于一条 AI 全栈学习路线的中期实践,前一步多半是把模型 API 跑通,从这…

2026/10/13 5:38:34 阅读更多 →
CS2启动器Overflow闪退根源与显存调度修复指南

CS2启动器Overflow闪退根源与显存调度修复指南

1. 问题本质:这不是“闪退”,而是内存管理机制被触发的保护性中断 “CS2更新后Valve界面闪退、Overflow溢出错误”——这个标题里藏着一个被广泛误读的关键点。很多用户一看到“闪退”就下意识归因于显卡驱动或系统兼容性,甚至反复重装客户端…

2026/10/13 5:38:34 阅读更多 →
x64dbg动态调试实战:环境配置、脚本自动化与避坑指南

x64dbg动态调试实战:环境配置、脚本自动化与避坑指南

简介:x64dbg 2025版逆向调试工具,面向软件安全分析人员、恶意代码逆向工程师以及CTF竞赛爱好者,用于在缺少源码、难以静态阅读的场景下开展动态调试,覆盖断点控制、单步跟踪、内存与寄存器监控、异常处理等核心操作,并…

2026/10/13 5:38:34 阅读更多 →
大厂Python编码规范的核心要点与工程实践

大厂Python编码规范的核心要点与工程实践

1. 为什么大厂如此重视Python编码规范?第一次接触Google的Python代码时,我盯着那些整齐划一的import分组和严格的命名规则发了半天呆。当时很不理解为什么要把时间花在这些"表面功夫"上,直到后来自己维护了三个月前的代码才恍然大悟…

2026/10/13 5:37:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →