fix: MKH-BOM 修复在途旧查询回写缓存,导致「同步最新数据」点完仍是旧数据 #20
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "codex/mkh-cache-stale-write-fix-0922"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
目的与范围
目的:修复「点『同步最新数据』后,页面 2~10 分钟内仍显示旧数据」的问题(业务表现为「像在用缓存」)。
范围:仅
backend/src/services/mkhBomService.js的缓存写入路径 + 对应单测,无接口字段删除、无口径变更。根因
本页 10 个进程内缓存都是同一写法:
若某个查询 in-flight 期间用户点了「同步最新数据」(
clearMkhBomCache()清空全部缓存),那个发起于清缓存之前的查询读到的仍是旧快照,返回时无条件把旧值写回缓存,
覆盖掉清缓存后新请求填入的新值 —— 谁后完成谁生效。
后果被放大:清缓存不但没生效,反而把旧数据「钉」在缓存里 2~10 分钟(各缓存 TTL),
用户看到的就是「点了同步还是旧数据」。并发越高越容易撞上(多人同时使用、或先点「刷新数据」
再点「同步最新数据」)。
修法:缓存代际
cacheEpochclearMkhBomCache()先自增代际,再清各缓存;本次结果只返回给发起它的那个请求,不写缓存。
覆盖 7 个变量型缓存(
officialBomIndex/businessBom/productBom/mkhProduct/workOrderIndex/orderIndex/replenishIndex)与 3 个按 key 的 Map 缓存(
officialBomDetail/componentLocation/componentStock)。POST /api/mkh-bom/sync响应新增cacheEpoch字段(纯新增,便于线上核对清缓存是否生效)。同步与兼容性
origin/main=4946018,git rev-list --count HEAD..origin/main= 0。clearMkhBomCache()返回对象仅多一个键。验证
对照组(临时去掉写回保护)实测报
expected: 1 / actual: 9—— 正是「点同步后拿到旧值」;加保护后通过。另加「同代际内缓存照常命中」回归保护用例。
node scripts/check-syntax.js通过;node --test test/*.test.js340 用例 / 339 通过,唯一失败为环境固有的
resilientSecretStoreWindows 权限断言(与基线一致)。POST /sync返回cacheEpoch=1;清缓存后冷查 8.5s(确实重查库);再查 37ms(缓存重新生效);前后数据指纹一致。
风险与回退
唯一新增行为是
sync响应多一个cacheEpoch字段。极端情况下若代际判断有误,表现为「缓存命中率略降、查询变慢」,不会返回错误数据。
git revert本提交即可,无数据迁移、无配置变更���无兼容性包袱。关联
outputs/验收-同步按钮数据时效核验-20260922.md(同批核验结论:按钮链路本身无缓存污染,取数逐字段与直连库吻合;另存在本 PR 修复的
并发回写竞态,以及上游侧
jst_inventoryInfo09-22 白天停更的时效问题 —— 后者非应用层可修)。未包含(待另议)
codex/mkh-sale-exclude-special-order-0919,出库校验 + 箱表兜底)仍未合并;本 PR 基于
main,与该分支在mkhBomService.js上可能有小冲突,需按业务语义融合。