供应链分布式事务:2PC、TCC、Saga模式详解
引言 分布式事务是供应链集成的难点,需要保证跨系统操作的一致性。本文将探讨分布式事务的解决方案。 1. 分布式事务场景 1.1 下单扣库存 场景: OMS创建订单 + 库存中心扣库存 要求:要么都成功,要么都失败 1.2 退款退库存 场景: OMS退款 + 库存中心加库存 要求:数据一致 2. 2PC(两阶段提交) 2.1 原理 准备阶段: 协调者 → 询问各参与者是否可以提交 参与者 → 执行事务并锁定资源,返回准备就绪 提交阶段: 协调者 → 发起提交/回滚 参与者 → 提交/回滚事务并释放资源 2.2 优缺点 优点: 强一致性 事务隔离 缺点: 性能差 同步阻塞 单点故障 适用场景: 对一致性要求极高 并发量不大 3. TCC(Try-Confirm-Cancel) 3.1 原理 Try阶段: 资源预留 业务检查 Confirm阶段: 确认提交 完成业务 Cancel阶段: 回滚操作 释放资源 3.2 实现示例 @TccTransaction public class OrderTccService { @Autowired private InventoryService inventoryService; /** * Try: 预占库存 */ @Try public boolean createOrder(Order order) { // 1. 创建订单(状态:待确认) order.setStatus("PENDING"); orderMapper.insert(order); // 2. 预占库存 boolean reserved = inventoryService.reserve( order.getSku(), order.getQuantity() ); if (!reserved) { throw new BusinessException("库存不足"); } return true; } /** * Confirm: 确认订单,扣减库存 */ @Confirm public void confirmCreateOrder(Order order) { // 1. 确认订单 order.setStatus("CONFIRMED"); orderMapper.updateById(order); // 2. 扣减库存 inventoryService.deduct(order.getSku(), order.getQuantity()); } /** * Cancel: 取消订单,释放库存 */ @Cancel public void cancelCreateOrder(Order order) { // 1. 取消订单 order.setStatus("CANCELLED"); orderMapper.updateById(order); // 2. 释放库存 inventoryService.release(order.getSku(), order.getQuantity()); } } 3.3 优缺点 优点: ...