zhaojie.tech/me

技术文章

全部来自我的零售 ERP SaaS 仓库的真实代码、真实参数与真实事故——它们同时是这个项目「代码可走读」承诺的入口。

项目实战复盘

9 篇

两套 Outbox:把"至少一次"圈进可管理的边界里

单据审核通过的一瞬间要发生太多事:扣库存、记财务账、更新统计。最早我把这些塞在审核事务里同步做——事务越拉越长,任何一个下游抖一下,用户点"审核"就转圈失败;后来拆成 MQ 异

2026-10-06T00:00:00.000Z

一段 Lua 扣四类 Key:促销防超卖的原子设计

促销上线第一周就被运营找上门:限时购活动设了 100 件库存,卖完后台一看,成交记录加起来是 104 件。复盘日志,两笔订单几乎同时进来,各自读到 stock=1,各自判断"够

2026-10-05T00:00:00.000Z

库存不是数,是流水:不可变事件账本的设计

做零售 ERP 的人迟早会面对一次"账对不上":库存表显示还有 3 件,货架上没有;或者月底盘点,成本金额和库存变动对不出。当年我靠 UPDATE quantity = qua

2026-10-04T00:00:00.000Z

多租户系统的 ThreadLocal 上下文:写进去只是第一步

一个真实 bug 带来这篇文字:测试环境里,A 租户的运营反馈看到了 B 租户的门店数据。查了一圈,SQL 没写错,拦截器在位,最后定位到那条请求走的是 @Async——wor

2026-10-04T00:00:00.000Z

用 JSqlParser 改写 SQL:自研数据权限引擎管住 137 张表

错误日志里有一句我亲手写不出来也删不掉的 SQL:

2026-10-03T00:00:00.000Z

当天第一单的流水号是错的:MySQL 序列表取号的三个坑

商户报:每天早上第一张单的流水号不是 1,是一个不知从哪来的大数。

2026-10-02T00:00:00.000Z

单号超长,收银全挂:一次由"预留号段"引发的线上事故

收银台扫码,主扫、被扫,全部失败。渠道只回一句:数据不符合约束要求。

2026-10-02T00:00:00.000Z

从一次重复记账的风险说起:支付回调幂等要落在存储层

对账巡检那天,同一笔渠道交易在账面上出现了两次。

2026-10-01T00:00:00.000Z

线上查不到数据,但没有任何报错:一次租户上下文"静默查空"的排查

没有报错,就是查不到数据。

2026-10-01T00:00:00.000Z

支付与交易

2 篇

消息与分布式事务

3 篇

MySQL

3 篇

Spring

2 篇

Redis 与并发

1 篇