分布式事务的几种实现方式:本地消息表、最大努力通知与TCC详解
创作时间:
作者:
@小白创作中心
分布式事务的几种实现方式:本地消息表、最大努力通知与TCC详解
引用
CSDN
1.
https://blog.csdn.net/2508_90580492/article/details/146107333
分布式事务是微服务架构中常见的技术问题,主要解决跨多个服务或数据库的数据一致性问题。本文将详细介绍几种主流的分布式事务实现方式,包括本地消息表、最大努力通知和TCC等,帮助读者理解它们的原理、优缺点和适用场景。
分布式事务实现方式详解
分布式事务的核心挑战是解决跨多个服务或数据库的数据一致性问题。以下是几种主流实现方式及其原理、优缺点和适用场景:
一、本地消息表(Transactional Outbox)
原理:
将分布式事务拆分为本地事务和异步消息,通过数据库事务+消息队列实现最终一致性。
实现步骤:
本地事务:业务操作与消息记录在同一个数据库事务中。
BEGIN TRANSACTION; -- 1. 扣减库存 UPDATE stock SET quantity = quantity - 1 WHERE product_id = 1001; -- 2. 插入本地消息表 INSERT INTO outbox (message_id, content, status) VALUES ('order_123', '{"order_id": 123}', 'pending'); COMMIT;消息投递:后台任务轮询本地消息表,将消息发送到MQ(如Kafka)。
消费确认:消费者处理消息后,调用接口确认消息状态。
消息清理:定期删除已处理的消息记录。
优点:
- 实现简单,依赖数据库事务保证原子性。
- 避免消息丢失(消息先落库再发送)。
缺点:
- 依赖轮询,实时性较低。
- 消息可能重复消费(需消费者幂等处理)。
适用场景:
- 对一致性要求不高,允许最终一致(如订单创建后通知物流系统)。
二、最大努力通知(Best-Effort Delivery)
原理:
服务方(如支付系统)完成本地事务后,多次重试通知调用方(如订单系统),直到对方确认成功或达到重试上限。
实现步骤:
- 执行本地事务:服务方完成业务操作(如支付扣款)。
- 异步通知:向调用方发送通知(HTTP回调或MQ消息)。
- 重试机制:若未收到确认,按指数退避策略重试(如1s、5s、10s…)。
- 最终处理:达到最大重试次数后,标记为失败并人工介入。
优点:
- 实现简单,适合跨系统交互。
- 依赖重试保证最终一致性。
缺点:
- 无法保证100%成功(网络不可用时可能丢失通知)。
- 调用方需幂等处理重复通知。
适用场景:
- 对一致性要求宽松的场景(如支付结果回调、短信通知)。
示例:
支付宝支付成功后,向商户系统发送支付结果通知,若失败则重试24小时。
三、TCC(Try-Confirm-Cancel)
原理:
通过Try(预留资源)、Confirm(确认操作)、Cancel(取消操作)三个阶段实现补偿型事务。
实现步骤:
Try阶段:检查资源并预留(如冻结库存、预扣金额)。
// 库存服务接口 boolean tryLockStock(Long productId, int quantity) { if (checkStock(productId) >= quantity) { freezeStock(productId, quantity); // 冻结库存 return true; } return false; }Confirm阶段:提交所有子事务,完成实际业务操作(如扣减库存、扣款)。
Cancel阶段:若任一子事务失败,回滚所有预留资源(如解冻库存、退款)。
优点:
- 强一致性,适合金融等高要求场景。
- 无锁设计,性能较高。
缺点:
- 业务侵入性强,需实现Try/Confirm/Cancel接口。
- 需处理空回滚(Try未执行但触发Cancel)和幂等问题。
适用场景:
- 对一致性要求严格的业务(如转账、秒杀库存)。
示例:
电商下单流程:
- Try:冻结库存、预扣用户余额。
- Confirm:扣减库存、实际扣款。
- Cancel:解冻库存、返还余额。
四、其他实现方式对比
方式 | 一致性 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
2PC(XA协议) | 强一致性 | 低 | 高 | 传统数据库(如银行核心) |
Saga | 最终一致性 | 中 | 中 | 长事务流程(如订票系统) |
本地消息表 | 最终一致性 | 中 | 低 | 异步通知场景 |
最大努力通知 | 最终一致性 | 高 | 低 | 跨系统回调 |
TCC | 强一致性 | 高 | 高 | 高并发金融交易 |
五、选型建议
- 强一致性需求:选择TCC或2PC(XA),但需权衡性能与复杂度。
- 最终一致性可接受:使用本地消息表或Saga。
- 跨系统通知:优先最大努力通知。
- 长业务流程:考虑Saga(通过事件编排或命令编排)。
总结
- 本地消息表:适合简单异步通知,依赖数据库事务。
- 最大努力通知:轻量级跨系统回调,需重试机制。
- TCC:强一致性场景,需业务实现补偿逻辑。
根据业务需求选择合适方案,平衡一致性、性能与实现成本。
热门推荐
厦门山海健康步道:绝美徒步路线推荐
淮河路步行街必打卡三大美食
淮河路必打卡:庐州烤鸭&庐州太太
淮河路步行街:老字号美食探秘之旅
厨房革命:健康美味小家电的兴起
成绩下滑别慌张,这样向父母求助最有效
爱因斯坦与闵可夫斯基:时空理论的革命性突破
酒精除污小窍门,告别摩擦剂烦恼
布洛芬使用指南:适用人群、禁忌症与安全用药原则
冬季汽车保养必看:发动机皮带检查与更换全攻略
商改住政策显成效:上海徐汇地块溢价3倍,深圳湾地价翻番
从硕放机场出发,玩转苏州:交通、景点、美食全攻略
磁共振检查:安全无辐射,这些情况需谨慎
古风结婚贺词精选:从四字到二十八字的孝道传承
8月结婚必看:13个黄道吉日和择日禁忌全解析
读懂内盘外盘:洞察股市买卖力量与主力动向
从内盘外盘看主力动向,精准捕捉股市交易机会
从挂号到拿单:医院病历开具全流程攻略
二陈汤加减:中医治疗慢性咳嗽的良方
王者荣耀S38赛季打野之争:马超、镜、影谁主沉浮?
网红打假热潮下的市场监管挑战
武汉广州先行先试,两部门联动推进“商改住”政策落地
11月对抗路三大恶霸:貂蝉、亚连、白起操作技巧揭秘
12月对抗路最强英雄榜单:貂蝉、亚连、老夫子领衔
亚连崛起:S36赛季对抗路新霸主
富马酸丙酚替诺福韦片副作用大揭秘:从常见到严重,这些要点需谨记
药监局提醒:富马酸丙酚替诺福韦片肾损害风险
厦门观音山:大佛禅寺&绝美海景,热门打卡地!
老年人吃牛肉:高蛋白低脂这样吃,每天不超过100克
老年人吃牛肉:4类人要注意,3个科学食用方法