多数据源事务一致性保障的工程实践
在分布式系统中,跨数据库事务一致性是常见难题。本文基于实际项目经验,分享一套可复用的解决方案。
核心思路:本地消息表 + 补偿机制
以订单创建为例,涉及用户、库存、财务三个数据源。我们采用本地消息表模式:
// 订单服务核心代码
@Transactional
public void createOrder(Order order) {
// 1. 创建订单
orderRepository.save(order);
// 2. 生成本地消息
Message message = new Message();
message.setBizId(order.getId());
message.setTopic("order_created");
message.setStatus("pending");
messageRepository.save(message);
// 3. 发送消息到MQ
rabbitTemplate.convertAndSend("order_exchange", "order.created", order);
}
补偿机制实现
// 消息处理服务
@Scheduled(fixedDelay = 5000)
public void processMessages() {
List<Message> pendingMessages = messageRepository.findByStatus("pending");
for (Message msg : pendingMessages) {
try {
// 执行业务逻辑
executeBusiness(msg);
// 更新消息状态为已处理
msg.setStatus("processed");
messageRepository.save(msg);
} catch (Exception e) {
// 异常时触发补偿
handleCompensation(msg);
}
}
}
关键工程实践
- 消息幂等性:通过唯一ID确保消息不重复处理
- 超时控制:设置消息处理超时时间,避免无限等待
- 监控告警:建立消息积压监控,及时发现异常
这套方案已在多个业务场景中稳定运行,可作为分布式事务处理的工程化参考。

讨论