跨库查询与一致性
分库一旦完成,最先找上门的不是性能问题,而是「之前一条 SQL 能查完的数据,现在查不出来了」。跨库 join 被迫消失、事务不再全局有效、主键冲突、对账差异——这四件事是分库项目的「四只拦路虎」。本篇记录我们逐一驯服它们的过程,原则是:不追求强一致,追求可解释、可修复的最终一致。
| 章节 | 内容 | 你将获得 |
|---|---|---|
| 3.1 跨库 join | 怎么绕开 | 绑定表、汇总表、应用层拼装三种武器 |
| 3.2 分布式事务 | 最终一致方案 | 本地消息表的完整设计 |
| 3.3 全局唯一 ID | 订单号生成 | 雪花 ID 的位分配与时钟回拨 |
| 3.4 数据同步 | 分片间对账 | 对账脚本与差异修复流程 |
分库之后的一致性问题,本质上与微服务拆分后的问题同构:单体变多体,共识成本从「数据库送给你」变成「你自己造」。如果你读过 Go 实战:微服务 CPS,会对本篇的最终一致方案感到熟悉。
本篇的核心立场是务实的:不追求强一致,追求可解释、可修复。跨库事务的成本可以被算清(3.2 节有完整评估),全局唯一 ID 的位分配可以一次定终身(3.3 节),对账系统让一切差异可见(3.4 节)。读完本篇,你应该能在自己的系统里回答「这笔数据现在可能不一致多久、由谁修复、多久修好」这三个问题。
延伸阅读
- go 实战:微服务 CPS:微服务间一致性与对账的对照实践
- java 实战:订单系统:单体时代事务与 join 是如何被白送的
