2026-09-07-remove-flash-pricing-lock-design.md 2.2 KB

移除闪送运价专用锁表设计

背景与目标

flash_delivery_pricing_lock 当前通过固定 GLOBAL 行和 SELECT ... FOR UPDATE 串行化平台运价增删改。闪送运价属于低频管理员配置,业务接受双击、重试或多页面同时操作时极低概率的并发新增冲突,因此移除专用锁表及锁代码,降低数据库结构和维护复杂度。

保留行为

  • flash_delivery_pricing 继续保存全局统一、互不重叠的分时段运价。
  • 新增、修改和删除仍在 Spring 事务内执行。
  • 新增和修改仍通过 countOverlapping(startTime, endTime, excludedId) 检查时段重叠。
  • 修改仍以 config_version 作为更新条件,拒绝旧页面覆盖新配置。
  • 报价和创建订单继续要求目标时间只匹配一个运价时段;异常重叠数据仍显式报错。
  • 运价字段、计价公式、加急费、小费和订单价格快照均不改变。

删除内容

  • 删除 FlashDeliveryPricingMapper.lockPricing() 及其 SELECT ... FOR UPDATE
  • 删除运价新增、修改、删除入口对 lockPricing() 的调用和服务层辅助方法。
  • 删除要求锁表及 FOR UPDATE 存在的 Mapper 契约测试。
  • updatesql/sql.md 追加 DROP TABLE IF EXISTS flash_delivery_pricing_lock;,仅记录,不直接执行数据库变更。
  • 更新闪送规格、设计、数据模型、计划和任务说明,不再将专用锁表作为当前架构组成。

并发边界

移除锁表后,两个并发新增请求可能同时通过重叠检查并各自写入。该风险由业务明确接受。修改请求仍受 config_version 乐观锁保护;读取侧继续检查匹配结果数量,因此即使出现异常重叠,也不会静默选择其中一条价格。

验证

  • 先删除应用服务测试夹具对固定 GLOBAL 锁行的模拟,验证管理员新增运价不应依赖专用锁行;旧实现会因此失败。
  • 删除生产锁逻辑后,移除只验证锁方法调用顺序的内部实现断言,并运行 Mapper、应用服务和 Controller 闪送定向测试。
  • 使用 JDK 21 执行 ruoyi-admin 相关模块测试和构建。
  • 提交前检查暂存清单,不能包含工作区原有注释修改或 .claude/homunculus/observations.jsonl