1) 【一句话结论】:分布式事务保证订单、库存、支付系统操作的原子性,核心是协调各系统的一致性,常见方案有2PC(强一致性但阻塞)、TCC(灵活但实现复杂)、Saga(异步补偿),需根据业务场景选择,如库存扣减用TCC,复杂业务用Saga。
2) 【原理/概念讲解】:分布式事务是指涉及多个独立服务(如订单、库存、支付)的跨系统操作,需保证“要么全部成功,要么全部失败”。
- 两阶段提交(2PC):协调者(事务管理器)发起事务,参与者(各系统)先预提交(检查资源,返回OK则准备提交,否则回滚),协调者根据参与者反馈决定提交或回滚。类比:银行转账,先锁定账户A余额,再锁定账户B余额,同时扣减或恢复。
- TCC(Try/Confirm/Cancel):业务逻辑拆分为三个阶段,Try(检查资源,预留,如库存够不够)、Confirm(确认执行,如扣减库存)、Cancel(回滚,如加回库存)。类比:库存扣减,先检查库存(Try),确认后扣减(Confirm),若失败加回(Cancel)。
- Saga:将事务拆分为多个本地事务,每个步骤提交后,后续步骤失败时补偿。类比:下单-扣库存-扣金额,若支付失败,补偿扣库存和金额。
3) 【对比与适用场景】:
| 方案 | 定义 | 特性 | 适用场景 | 注意点 |
|---|
| 两阶段提交(2PC) | 协调者控制参与者,强一致性 | 强一致性,阻塞(协调者故障时参与者阻塞),依赖协调者 | 核心数据一致性要求高的场景(如金融转账) | 故障时可能阻塞,协调者单点故障 |
| TCC | 业务逻辑拆分为Try/Confirm/Cancel | 无阻塞,灵活,需业务设计 | 库存、订单等日常业务(如扣减库存、扣款) | 实现复杂,需幂等处理 |
| Saga | 拆分为本地事务,异步补偿 | 异步,适合复杂业务 | 复杂业务(如订单-库存-支付-通知) | 补偿可能失败,需重试或人工介入 |
4) 【示例】:以订单创建为例,涉及库存扣减、支付扣款。
- 2PC示例:
- 订单系统发起全局事务,协调者通知库存、支付系统准备。
- 库存系统检查库存(预提交),返回OK则准备扣减;支付系统检查余额,返回OK则准备扣款。
- 协调者收到所有OK,发起提交,库存扣减,支付扣款。若任一系统返回失败,协调者回滚,库存加回,支付退款。
- TCC示例:
库存系统:
Try:检查库存是否≥数量,返回True则预留库存。
Confirm:扣减库存(库存-数量)。
Cancel:加回库存(库存+数量)。
支付系统:
Try:检查账户余额是否≥金额,返回True则预留余额。
Confirm:扣减余额(余额-金额)。
Cancel:退款(余额+金额)。
订单系统调用库存的Confirm,支付系统的Confirm,若任一失败,调用Cancel。
- Saga示例:
步骤1:订单创建(本地提交,生成订单ID)。
步骤2:扣库存(库存系统本地提交,扣减库存)。
步骤3:扣金额(支付系统本地提交,扣款)。
步骤4:通知支付(发送消息到支付系统)。
若步骤3失败,补偿步骤2(加回库存),步骤3(加回金额)。
5) 【面试口播版答案】:
“面试官您好,分布式事务的核心是保证订单、库存、支付系统操作的原子性,即要么全部成功,要么全部失败。常见解决方案有2PC、TCC、Saga。
两阶段提交(2PC)通过协调者控制参与者,实现强一致性,但可能因协调者故障导致阻塞;TCC通过Try/Confirm/Cancel阶段,灵活且无阻塞,但业务设计复杂;Saga将事务拆分为本地事务,用异步补偿保证最终一致性,适合复杂业务。
以库存扣减为例,TCC的Try检查库存,Confirm扣减,Cancel加回,能灵活处理库存不足的情况;对于订单-库存-支付-通知的复杂流程,Saga通过补偿机制解决支付失败的问题。
综合来看,核心数据一致性要求高的场景用2PC,日常业务用TCC,复杂业务用Saga,需根据业务复杂度和一致性需求选择方案。”
6) 【追问清单】:
- 2PC的阻塞问题如何解决?
- 回答要点:可通过预写日志(WAL)优化,或采用三阶段提交(3PC),但会增加复杂度,实际中可通过异步补偿结合2PC解决部分阻塞。
- TCC的Confirm和Cancel如何保证幂等?
- 回答要点:通过幂等检查,比如库存扣减时检查是否已确认,若已执行则跳过;或使用唯一标识(如订单ID)确保操作只执行一次。
- Saga的补偿失败如何处理?
- 回答要点:补偿失败后,可重试补偿操作,或记录补偿失败,由人工介入处理,避免数据不一致。
- 分布式事务的最终一致性如何保证?
- 回答要点:通过异步消息和补偿机制,确保即使部分步骤失败,后续步骤也能通过补偿恢复一致性。
- 如果库存系统宕机,如何回滚订单?
- 回答要点:协调者检测库存系统故障,触发回滚操作,通知支付系统退款,并补偿库存加回,保证数据一致性。
7) 【常见坑/雷区】:
- 忽略2PC的阻塞问题,错误认为2PC完美适用于所有场景。
- TCC业务设计错误,比如Confirm和Cancel逻辑不匹配,导致数据不一致。
- Saga补偿逻辑遗漏,导致部分操作无法回滚,数据不一致。
- 忽略分布式事务的故障场景,比如部分系统宕机,未考虑回滚机制。
- 混淆2PC和TCC,比如2PC的协调者角色与TCC的业务逻辑实现方式。