hl-api-changelog/changelogs-v2/2026-08/06_5575_用车需求重复提交幂等(FOR-UPDATE锁修复+同内容重放不产生新行)-修改接口-管理后台.md
Mimingguang d893c56d8a
一些检查失败了
changelog-filename-gate / validate (push) Failing after 2s
chore(changelog): 核账 #5575 前端无需改动
修改原因:用车需求幂等修复新增可选成功分支值。

修改内容:确认现有页面不穷举 branchTaken,回写 not_required。

实际验证:核对 API、响应解包、提交成功流程和直接测试。

Changelog:#5575 source 文档。
2026-08-06 11:38:28 +08:00

3.8 KiB

schema, ticket, title, consumer, author, change_type, backend_status, gateway_status, frontend_status, frontend_owner, frontend_ref, target_release, verified_at, status_note, updated_at, base, generated
schema ticket title consumer author change_type backend_status gateway_status frontend_status frontend_owner frontend_ref target_release verified_at status_note updated_at base generated
hl-changelog/v2 5575 用车需求重复提交幂等FOR UPDATE锁修复+同内容重放不产生新行) admin wx(GIT) 修改接口 deployed verified not_required pi-main-session N/A请求字段和成功控制流不变,现有页面不穷举 branchTaken。 v2.1 2026-08-06 后端完成PR #5584/#5585 已合并 dev-v3 并部署 TEST;网关验证 3/3连续同内容重放 2 次均返回 IDEMPOTENT_NOOP 同 requirementId,无新行;内容变化仍走 PENDING_EDIT;存量 v3 双行已按清理 manifest 清理。响应新增 branchTaken=IDEMPOTENT_NOOP 取值(前端可据此提示'内容未变化'),其余契约不变。 2026-08-06 dev-v3 2026-08-06T11:07:21+08:00

用车需求重复提交幂等FOR UPDATE锁修复+同内容重放不产生新行)

后端完成PR #5584/#5585 已合并 dev-v3 并部署 TEST,网关验证 3/3 通过。

关联 / 联系人

链接

联系人

  • 后端负责人: @wx

背景

订单 2080600006514872322 需求 V3 两条记录2085009136168177665 PROCESSING + 2085009096510935041 PENDING,同 version=3——重复提交双写双击/重试/重放)。

修复

  1. 并发双写VehicleRequirementMapper.selectLatestByOrderIdForUpdate.last("FOR UPDATE").last("LIMIT 1")——MyBatis-Plus last() 覆盖式,LIMIT 1 覆盖掉 FOR UPDATE → 提交事务退化为快照读,并发提交基于同一快照算出同 version 双行。修复为单段 .last("LIMIT 1 FOR UPDATE")MySQL 语法 FOR UPDATE 须在 LIMIT 后)
  2. 顺序重复提交PENDING/PENDING_REVIEW 分支先做内容语义比较fleet/行程日期/接送机/特殊标签/备注,JsonNode 解析比较兼容存量空格/字段序差异),完全一致时返回 IDEMPOTENT_NOOP 分支的当前版本——不插新行、不失活旧行、不触发 expand/reconcile/outbox

变更接口

方法 路径 来源
PUT /v3/admin/order/{id}/vehicle-requirement VehicleRequirementAdminControllerorder-v3

请求/响应字段无变化。响应 branchTaken 新增取值 IDEMPOTENT_NOOP(重复提交时返回当前 requirementId/version 不变)。

前端/调用方动作

  1. 提交按钮可重复点击:同内容重复提交返回 branchTaken=IDEMPOTENT_NOOP,前端可提示"内容未变化"或直接忽略,无需做前端防抖(后端已幂等)
  2. 内容变化提交仍走 PENDING_EDIT/DONE_ADJUST,行为不变

验证证据

  • 定向测试RequirementServiceTest 198/198+2同内容→IDEMPOTENT_NOOP 且 insert/update/expand 未调用;内容变化→PENDING_EDIT;MapperTest 7/7+2 SQL 形态断言;VehicleRequirementConcurrentVersionMysqlTest 4/4+1 真实 MySQL LIMIT 1 FOR UPDATE 并发用例)
  • 网关验证TESTHL20260805165915481 连续同内容重放 2 次均返回 IDEMPOTENT_NOOP 同 requirementId2085199671193411585v1,无新行;存量带空格 fleet JSON 语义比较正确
  • 数据清理2080600006514872322 v3 双行按 manifest 清理(删 2085009096510935041,保留 2085009136168177665,v1-v5 各版本唯一
  • 兼容性结论:无契约变化;存量数据语义比较兼容;未传字段的旧调用保持原行为