SYB 同步写入货运单 260820U552NENE 时,商品目录 xlsx-processed 与 SYB 同步并发写入相同 (goods_id, spec_key),触发 shopee_skus.uq_shopee_skus_spec 唯一键错误,导致本次同步停止。
260820U552NENE
xlsx-processed
(goods_id, spec_key)
shopee_skus.uq_shopee_skus_spec
已确认:目录 SKU 在失败同步运行期间创建;后续重跑 SYB 同步成功。问题不是上游规格重复,而是 UpsertCatalogShopeeSKU 的“先查询、后 INSERT”不是并发安全的原子 upsert。
UpsertCatalogShopeeSKU
做:
shopee_skus
fill_missing
不做:
INSERT
uq_shopee_skus_spec
预计修改文件:
admin/repository/catalog_import.go
admin/repository/catalog_import_test.go
从 admin/ 目录执行:
admin/
$env:GOTOOLCHAIN="go1.23.0" go test ./repository ./service -count=1 go build ./... Remove-Item Env:GOTOOLCHAIN
真实验证:目录导入与 SYB 同步重叠时,同一规格只保留一条 SKU,SYB 同步完成;不执行采购或付款。
风险:把未知唯一键冲突误判为可恢复冲突,可能隐藏数据问题。控制方式:只恢复命名为 uq_shopee_skus_spec 的 MySQL 1062;重读后必须得到同一 (goods_id, spec_key) 记录,其他情况仍返回错误。
回退:撤销本工单代码提交即可;本任务不含迁移和数据改写。
实现完成,状态:待验收。
实现:
SELECT ... FOR UPDATE
验证:
$env:GOTOOLCHAIN="go1.23.0"; go vet ./...; go test ./... -count=1
$env:GOTOOLCHAIN="go1.23.0"; go build ./...
_test
提交:
05b04e0
fix: 恢复并发 SKU 规格唯一键冲突 (#283)
9c22ec6
docs: 归档任务 #283
归档:docs/task/283-恢复并发SKU规格唯一键冲突.md
docs/task/283-恢复并发SKU规格唯一键冲突.md
No dependencies set.
The note is not visible to the blocked user.
基本信息
要解决什么
SYB 同步写入货运单
260820U552NENE时,商品目录xlsx-processed与 SYB 同步并发写入相同(goods_id, spec_key),触发shopee_skus.uq_shopee_skus_spec唯一键错误,导致本次同步停止。已确认:目录 SKU 在失败同步运行期间创建;后续重跑 SYB 同步成功。问题不是上游规格重复,而是
UpsertCatalogShopeeSKU的“先查询、后 INSERT”不是并发安全的原子 upsert。做什么 / 不做什么
做:
shopee_skus的规格唯一键并发撞键进行安全恢复;fill_missing规则;不做:
已确认的实现方案
UpsertCatalogShopeeSKU的创建分支抽成“读取当前记录后应用既有规则”的内部路径。INSERT出现 MySQL 1062 且键为uq_shopee_skus_spec时,重新以当前读读取该规格记录并进入已有更新逻辑;其他数据库错误仍原样返回。xlsx-processed或人工字段。预计修改文件:
admin/repository/catalog_import.goadmin/repository/catalog_import_test.go或新增对应 MySQL 集成测试文件验收标准
uq_shopee_skus_spec并发重复键不再使 SYB 同步失败。fill_missing规则补空字段,不覆盖目录或人工字段。验证方式
从
admin/目录执行:真实验证:目录导入与 SYB 同步重叠时,同一规格只保留一条 SKU,SYB 同步完成;不执行采购或付款。
风险和回退
风险:把未知唯一键冲突误判为可恢复冲突,可能隐藏数据问题。控制方式:只恢复命名为
uq_shopee_skus_spec的 MySQL 1062;重读后必须得到同一(goods_id, spec_key)记录,其他情况仍返回错误。回退:撤销本工单代码提交即可;本任务不含迁移和数据改写。
实现完成,状态:待验收。
实现:
uq_shopee_skus_spec的并发冲突;SELECT ... FOR UPDATE当前读取得竞争方已提交 SKU;fill_missing、来源优先级和人工字段保护;验证:
$env:GOTOOLCHAIN="go1.23.0"; go vet ./...; go test ./... -count=1$env:GOTOOLCHAIN="go1.23.0"; go build ./..._test库制造真实并发事务。提交:
05b04e0fix: 恢复并发 SKU 规格唯一键冲突 (#283)9c22ec6docs: 归档任务 #283归档:
docs/task/283-恢复并发SKU规格唯一键冲突.md