租户 1002 的订单列表显示 38 条,翻页组件却显示共 1206 条,点第 3 页直接空白。把 pageSize 改成 500 能看到 500 行里有 460 行属于别的租户。乍看像缓存或者权限的锅,追下去往往不是。

EXPLAIN SELECT COUNT(*) FROM orders WHERE status = 1;
EXPLAIN SELECT COUNT(*) FROM orders WHERE status = 1 AND tenant_id = 1002;
-- 两条 count 结果应当只差租户维度

追下去是这么回事:列表查询的 count 语句是另外拼的,只带了状态和时间条件,漏掉 tenant_id。分页的数据语句由拦截器自动注入租户条件,count 走手写 SQL,拦截器管不到。

「租户条件漏加」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,count 和列表用同一个 where 片段 不要单独手写;在拦截器里同时处理 select 和 count 两种语句;开两个测试租户各造 10 条数据 交叉核对总数。

验收就看一点,租户 1002 的分页总数变成 38,与列表返回的条数一致,第 2 页为空。

作者 9823189