在Spring Boot微服务架构中,分布式事务的处理一直是开发者的痛点。本文将对比几种主流的分布式事务补偿机制:基于消息队列的最终一致性、TCC(Try-Confirm-Cancel)模式和Saga模式。
消息队列方案 这是最常用的解决方案,通过MQ实现异步消息传递。以RocketMQ为例,核心代码如下:
@Service
public class OrderService {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Transactional
public void createOrder(Order order) {
// 创建订单
orderMapper.insert(order);
// 发送消息
rocketMQTemplate.send("order_created", order);
}
}
消费者端处理:
@RocketMQMessageListener(topic = "order_created", consumerGroup = "order_consumer")
public class OrderConsumer implements RocketMQListener<Order> {
@Override
public void onMessage(Order order) {
// 处理订单相关业务
inventoryService.reduceStock(order.getProductId());
accountService.deductBalance(order.getUserId(), order.getAmount());
}
}
TCC模式实现 TCC通过业务层面的补偿来保证事务一致性:
@Tcc
public class AccountService {
// Try阶段
public void prepare(@Param("userId") Long userId, @Param("amount") BigDecimal amount) {
// 预留资金
accountMapper.reserve(userId, amount);
}
// Confirm阶段
public void commit(@Param("userId") Long userId, @Param("amount") BigDecimal amount) {
// 确认扣款
accountMapper.confirmDeduct(userId, amount);
}
// Cancel阶段
public void cancel(@Param("userId") Long userId, @Param("amount") BigDecimal amount) {
// 回滚资金
accountMapper.rollbackReserve(userId, amount);
}
}
Saga模式对比 Saga模式将长事务拆分为多个短事务,每个事务都有对应的补偿操作。通过事件驱动的方式实现:
@Component
public class OrderSaga {
public void processOrder(Order order) {
try {
// 1. 创建订单
createOrder(order);
// 2. 扣减库存
reduceInventory(order);
// 3. 扣减余额
deductBalance(order);
} catch (Exception e) {
// 异常时触发补偿
compensate(order);
}
}
private void compensate(Order order) {
// 按相反顺序执行补偿操作
refundBalance(order);
restoreInventory(order);
cancelOrder(order);
}
}
方案对比总结 消息队列方案实现简单但存在消息丢失风险;TCC模式性能好但开发复杂;Saga模式适合长事务场景。在实际项目中,建议根据业务特点选择合适的补偿机制。

讨论