
微服务拆分后,跨服务写操作(下单扣库存加积分)不可能都塞进一个数据库事务。XA/2PC 性能与可用性代价太高,绝大多数业务的正确选择是最终一致性:允许短暂的不一致,但保证系统最终收敛到正确状态。落地的两个主流方案是本地消息表与事务消息,选错方案是很多「数据不一致」事故的根因。一、本地消息表:简单可靠的默认选择
原理:业务操作与「待发布消息」在同一个本地事务里落库,再由后台任务扫描消息表投递到 MQ,投递成功后标记完成。
FOR UPDATE SKIP LOCKED 或分布式锁);以 RocketMQ 事务消息为代表:先发半消息(half message)→ 执行本地事务 → 提交/回滚消息 → Broker 定时回查本地事务状态兜底。

生产端保证「消息必达」只是前半场,消费端要保证「必达且不重复处理」:

消息量 < 日均百万或团队小 → 本地消息表;深度 RocketMQ + 大消息量 → 事务消息;无论哪个,消费幂等 + 死信告警 + 定期对账三件套必须齐全。
最终一致性的工程本质:把「一次大事务」拆成「多次可重试的小事务」,每一步都幂等、可追溯、可补偿。做到这三点,数据不一致就从「生产事故」降级为「对账工单」。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。