微服务架构下分布式事务的优化技巧
在微服务架构中,分布式事务一直是开发者面临的难题。最近项目中遇到了一个典型的场景:用户下单后需要同时更新库存和创建订单记录,这涉及到两个不同的服务。
问题复现步骤
- 创建订单服务和库存服务
- 调用下单接口时,先调用库存服务扣减库存
- 再调用订单服务创建订单
- 如果库存扣减成功但订单创建失败,数据不一致
我的踩坑经历
最初尝试使用两阶段提交(2PC),但发现性能问题严重。后来改用 Saga 模式,通过补偿机制解决。
代码实现:
@Service
public class OrderService {
@Autowired
private InventoryService inventoryService;
@Transactional
public void createOrder(Order order) {
// 1. 扣减库存
boolean stockSuccess = inventoryService.deductStock(order.getProductId(), order.getQuantity());
if (!stockSuccess) {
throw new RuntimeException("库存不足");
}
// 2. 创建订单
orderRepository.save(order);
// 3. 发送消息通知
messageService.sendOrderCreatedMessage(order.getId());
}
}
实际优化方案
- 本地消息表:在订单服务中增加本地消息表,保证操作原子性
- 异步补偿机制:通过定时任务检查未完成的事务状态
- 幂等性设计:确保重复调用不会产生副作用
最终效果
将事务处理时间从原来的500ms降低到150ms,系统稳定性显著提升。
这个优化过程让我深刻体会到,分布式事务不能简单套用理论,需要结合业务场景进行针对性设计。

讨论