支付系统的分布式事务:两阶段提交与 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/7/21 0:32:36 阅读更多 →
AI 服务流量回放:用历史请求构建推理服务回归测试集

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

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

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

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

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

2026/7/21 0:31:35 阅读更多 →

最新新闻

基于YOLOv5改进的农业杂草识别系统设计与优化

基于YOLOv5改进的农业杂草识别系统设计与优化

1. 项目背景与核心价值在农业智能化转型的大背景下,杂草识别一直是精准农业中的关键痛点。传统人工除草方式效率低下且成本高昂,而过度使用除草剂又会导致土壤污染和生态破坏。基于深度学习的杂草识别系统为解决这一难题提供了新的技术路径。我去年指导的…

2026/7/25 4:14:07 阅读更多 →
Node.js+Vue3打造健身房人脸识别系统实战

Node.js+Vue3打造健身房人脸识别系统实战

1. 项目背景与核心价值最近在帮本地一家连锁健身房做数字化升级,他们最大的痛点就是会员忘带卡、前台排队验证身份的问题。传统刷卡系统不仅硬件成本高,还经常出现代刷、冒用的情况。于是我们基于Node.jsVue3开发了一套人脸识别健身房管理系统&#xff0…

2026/7/25 4:14:07 阅读更多 →
MSP430FR5x硬件设计实战:JTAG调试、复位电路与PCB布局避坑指南

MSP430FR5x硬件设计实战:JTAG调试、复位电路与PCB布局避坑指南

1. 项目概述与核心价值在嵌入式硬件设计的江湖里,MSP430FR5x系列MCU以其独特的FRAM(铁电随机存取存储器)和超低功耗特性,一直是电池供电、数据记录和便携式设备领域的明星选手。但很多工程师,尤其是刚接触这个系列的朋…

2026/7/25 4:14:07 阅读更多 →
Unity集成RMBG-2.0实现实时角色背景分离:从模型推理到性能优化全解析

Unity集成RMBG-2.0实现实时角色背景分离:从模型推理到性能优化全解析

1. 项目概述:当游戏角色需要“走出”屏幕在游戏开发中,我们常常会遇到一个看似简单却颇为棘手的需求:如何让游戏中的角色或物体,从它原本的背景中“干净”地剥离出来,并实时地融入到另一个动态场景里?比如&…

2026/7/25 4:14:07 阅读更多 →
C++实现影视数据可视化系统:从架构设计到OpenGL渲染实战

C++实现影视数据可视化系统:从架构设计到OpenGL渲染实战

1. 项目概述与核心价值最近几年,数据可视化在各个领域都火得不行,影视行业也不例外。大家可能都见过那种酷炫的票房地图、演员关系图谱,或者动态展示电影评分趋势的图表。这些背后,往往都有一套专门的数据可视化系统在支撑。今天&…

2026/7/25 4:14:07 阅读更多 →
AI工具优化研究生开题报告的实用指南

AI工具优化研究生开题报告的实用指南

1. 开题报告优化的痛点与AI解决方案写开题报告是每个研究生都要经历的"必修课",但这份看似简单的文档往往成为学术道路上的第一道坎。我指导过上百份开题报告,发现80%的初稿都存在这些问题:文献综述像拼凑的补丁、研究内容缺乏创新…

2026/7/25 4:13:06 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻