7bc90b0be64df285995e793025f6f553b7dce6f4
changelog-filename-gate / validate (push) Failing after 2s
hl-fleet-service 车型价格日历四个写口(批量设价 / 多车型批量设价 / 批量改状态 / 清除价格日历) 此前虽各自写了相同的 @Lock4j keys,但都没写 name;lock4j 落 Redis 的锁键含方法名, name 缺省时退化成「类全限定名 + 方法名」,四处因此各自持有一把互不相干的锁—— 接口文档里一直写着的「四个价格写端点全互斥」此前并不成立。本次补上同一个显式 name,互斥才真正生效。 接口路径、方法、请求/响应字段、既有 4 个业务错误码(600500-600503)均零增删。 唯一的契约变化是新增一条可能返回的错误码 100503(RESOURCE_LOCKED,「资源被占用,请稍后重试」), 且它以 HTTP 200 + body code 的形式返回——前端只看 HTTP 状态码会把它当成功。 关于 100503 的触发频率,正文两面都写,缺一面都会误导前端: - 该路径源码级真实存在(acquireTimeout 默认 3000ms + LockFailureExceptionHandler 转 100503 + @ResponseStatus(HttpStatus.OK),三处均已读码确认); - 但测试服用 4/8/17/34 并发 × 365 天多轮尝试均返回 200,一次未触发(推断原因:本次优化后 单车型 366 天的 DB 往返从 732 次降到个位数,临界区极短,累计排队远小于 3 秒)。 ⇒ 前端仍应防御性处理并允许重试,但不必按高频路径设计交互; 同时不能因为测试服没测到就当它不会发生——更长事务 / 更大载荷 / 生产数据量下的行为未知。 测试服证据(backend_status 因此才从 pending 转为 deployed,此前门禁 E_BACKEND_PENDING 正确拦下过一次): 部署前 53c2ff2d1 → 部署后 10efbaddf,merge-base --is-ancestor ee1937950 10efbaddf 返回 ANCESTOR_YES; redis-cli MONITOR 实时抓包证实 12 并发只命中同一把锁键 lock4j:fleet:pricing-calendar:write#fleet:pricing-calendar:write,改前那种含方法名的坏形态一次未现, 12 组干净的 acquire→release、未观察到两个持有者同时持锁;71 次回归调用全部 code=200。 测试数据写在原本全空的未来年份(2027 部分/2028/2031/2032/2033,71 组车型×年份), 已用 71 次 DELETE 逐一还原并按年复核归零,真实业务数据(2026-09 丰田普拉多 24 条)抽查与改前一致。 gateway_status 记 not_required:四端点路径/方法零变化、hl-gateway 版本未动(4cbccc26b), 是判定不是漏验证,判据已写进 status_note。 Refs #7980 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
描述
后端接口修改详细记录 - 自动同步
34 MiB
语言
HTML
77.2%
JavaScript
22.5%
Shell
0.3%