Răsfoiți Sursa

确定移除闪送运价专用锁表

记录保留事务、重叠校验和版本校验的简化方案,并明确接受低频管理员配置下的并发新增风险。
qmj 3 zile în urmă
părinte
comite
e5f7872e15

+ 33 - 0
docs/superpowers/specs/2026-09-07-remove-flash-pricing-lock-design.md

@@ -0,0 +1,33 @@
+# 移除闪送运价专用锁表设计
+
+## 背景与目标
+
+`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` 乐观锁保护;读取侧继续检查匹配结果数量,因此即使出现异常重叠,也不会静默选择其中一条价格。
+
+## 验证
+
+- 先调整 Mapper 契约测试,使旧实现因仍暴露 `lockPricing()` 而失败。
+- 删除生产锁逻辑后运行 Mapper、应用服务和 Controller 闪送定向测试。
+- 使用 JDK 21 执行 `ruoyi-admin` 相关模块测试和构建。
+- 提交前检查暂存清单,不能包含工作区原有注释修改或 `.claude/homunculus/observations.jsonl`。