分布式事务场景
2020年某支付平台的转账系统出现了严重的资金不一致问题:用户A向用户B转账100元,扣款成功但收款失败。
技术团队排查后发现:转账业务涉及两个服务——账户服务(扣款)和通知服务(通知收款方)。账户服务扣款成功了,但通知服务调用失败,整个事务回滚时,账户服务没有回滚成功。
这次不一致导致平台损失了约1万元,因为扣款了但没通知用户。
分布式事务是分布式系统中最经典的问题之一。
【面试官手记】
分布式事务是生产环境最复杂的问题之一。我面试过的候选人里,能说清楚"2PC和3PC区别"的不超过30%,能说清楚"TCC和Saga区别"的不超过20%。分布式事务的关键是理解每种方案的trade-off。
一、分布式事务的CAP理论 🔴
1.1 CAP三角
1.2 BASE理论
1.3 面试追问
面试官:分布式事务有哪些解决方案?
候选人:主要有四种:
一是2PC/3PC:强一致,但性能差,有单点问题
二是TCC:补偿模式,性能好,但实现复杂
三是Saga:长事务模式,适合长流程
四是本地消息表:最终一致,实现简单
【面试官心理】
分布式事务的追问通常很深入。能回答出四种方案的候选人,说明知道全貌;能说出各方案trade-off的候选人,说明有深度理解。
二、两阶段提交(2PC)🔴
2.1 原理
2.2 代码示例
2.3 问题
三、TCC模式 🟡
3.1 原理
3.2 代码示例
四、Saga模式 🟡
4.1 原理
4.2 代码示例
五、方案对比 🟡
5.1 方案对比
5.2 选型建议
六、生产避坑 🟡
6.1 分布式事务的五大坑
坑1:TCC幂等性
坑2:悬挂问题
坑3:服务间循环依赖
坑4:补偿逻辑复杂
坑5:超时机制不完善
七、真实面试回放 🟡
面试官:2PC和TCC的区别是什么?
候选人(小张):两个区别:
一是执行位置不同。2PC是在数据库层面,由TM和RM协调;TCC是在业务层面,由业务代码实现。
二是资源锁定不同。2PC锁数据库资源,时间长;TCC锁的是业务预留的资源,时间短。
面试官:TCC的Try-Confirm-Cancel分别做什么?
小张:Try是预留资源,比如冻结金额;Confirm是确认使用资源;Cancel是释放资源。
扣款的例子:Try阶段检查余额并冻结,Confirm阶段确认扣除冻结金额,Cancel阶段解冻金额。
面试官:Saga模式适合什么场景?
小张:长流程业务。比如创建订单 → 扣款 → 发货 → 收货 → 完成。
每个步骤都是独立的服务,失败了再逐一回滚。
【面试官手记】
小张这场面试的亮点:
知道2PC和TCC的区别:数据库层面 vs 业务层面
知道TCC的Try/Confirm/Cancel语义
知道Saga适合长流程
分布式事务是P7工程师必备技能,能完整回答的候选人,说明有架构设计能力。
分布式事务的核心是根据业务场景选择合适方案。记住三个要点:
- 2PC/TCC:适合短事务,CP优先
- Saga:适合长流程,AP优先
- 本地消息表:最终一致,实现简单
没有最好的方案,只有最适合业务场景的方案。