供应链分布式事务: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 优缺点 优点: ...

2025-11-22 · maneng

分布式事务:从ACID到BASE的演进

引子:一次支付失败引发的数据不一致 2021年某电商平台出现严重Bug:用户支付成功,但订单状态未更新,导致重复支付。 故障流程: 1. 订单服务:创建订单(成功) 2. 库存服务:扣减库存(成功) 3. 支付服务:调用支付(成功) 4. 订单服务:更新订单状态(失败,网络超时) 结果:支付成功,但订单状态仍为"未支付",用户再次支付 核心问题:微服务架构下,如何保证多个服务的数据一致性? 一、事务的本质:ACID四大特性 1.1 本地事务(单体架构) ACID特性: 原子性(Atomicity):要么都成功,要么都失败 一致性(Consistency):数据始终处于一致状态 隔离性(Isolation):并发事务互不干扰 持久性(Durability):提交后永久保存 示例: @Transactional public void createOrder(OrderRequest request) { // 1. 创建订单 Order order = new Order(); orderRepository.save(order); // 2. 扣减库存 Inventory inventory = inventoryRepository.findByProductId(request.getProductId()); inventory.setStock(inventory.getStock() - request.getQuantity()); inventoryRepository.save(inventory); // 3. 创建支付记录 Payment payment = new Payment(); paymentRepository.save(payment); // 如果任何一步失败,全部回滚 } 1.2 分布式事务的困境 微服务架构下: 订单服务 → Order_DB 库存服务 → Inventory_DB 支付服务 → Payment_DB 问题:三个独立的数据库,无法用本地事务保证一致性 二、CAP定理与BASE理论 2.1 CAP定理 CAP定理指出,分布式系统最多只能同时满足以下三项中的两项: ...

2025-11-03 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...