事务边界与事件排序:金融级数据一致性的实现
一次“转账成功但余额对不上”的血泪复盘
那是去年冬天的一个周五下午,财务系统突然报警:
“用户 A 向 B 转账 10,000 元,A 账户扣款成功,B 账户却没收到钱!”
我们立刻停掉所有 CDC 同步任务,紧急排查。
日志显示:
- Debezium 确实捕获了两条变更:
accounts表:A 余额 -10,000(时间戳 T1)accounts表:B 余额 +10,000(时间戳 T2)
- 但下游消费时,先收到了 B 的 +10,000,再收到 A 的 -10,000!
结果:中间状态显示“凭空多出 10,000 元”,风控系统直接冻结了整个账户。
那一刻我意识到:在金融场景,顺序错了,等于数据错了。
今天,我就带你深入 Debezium 的事务机制,揭秘如何用LSN 追踪 + transaction topic实现金融级一致性。
一、问题根源:CDC 打破了数据库的事务原子性
在 MySQL 中,转账是这样写的: