后端/小程序:getOrCreateDefaultProject 幂等化,禁止重复建默认项目和素材库 #1775

Closed
opened 2026-09-07 22:06:10 +08:00 by xiaoxia · 1 comment
Owner

背景

小程序端上传素材时,getOrCreateDefaultProject 在重试、并发或前端重复调用场景下,可能为同一用户重复创建默认项目和默认素材库。仅靠“先查再插”无法保证幂等。

修复要求

  1. 定位 miniapp-bff / 后端中 getOrCreateDefaultProject 及默认素材库创建逻辑。
  2. 同一用户的默认项目必须唯一:使用数据库唯一约束、upsert、事务锁或等价机制保证,不能只依赖应用层先查后插。
  3. 默认项目与默认素材库的创建要在同一事务中完成,或有可靠补偿;并发请求必须返回同一条项目和同一条素材库记录。
  4. 如需增加唯一索引,先检查存量重复数据:
    • staging 的测试重复数据可清理;
    • 生产重复数据只输出清单和合并/清理方案,不自动删除。
  5. 补充并发和重试测试。

验收标准

  • 同一用户连续/并发调用 10 次,只创建 1 个默认项目和 1 个默认素材库。
  • 上传失败重试不会产生第二个空项目/空素材库。
  • 不同用户各自拥有独立默认项目。
  • 唯一约束冲突时接口返回已有记录,不报 500。
  • PR 目标分支为 develop,禁止合并 main
## 背景 小程序端上传素材时,`getOrCreateDefaultProject` 在重试、并发或前端重复调用场景下,可能为同一用户重复创建默认项目和默认素材库。仅靠“先查再插”无法保证幂等。 ## 修复要求 1. 定位 miniapp-bff / 后端中 `getOrCreateDefaultProject` 及默认素材库创建逻辑。 2. 同一用户的默认项目必须唯一:使用数据库唯一约束、upsert、事务锁或等价机制保证,不能只依赖应用层先查后插。 3. 默认项目与默认素材库的创建要在同一事务中完成,或有可靠补偿;并发请求必须返回同一条项目和同一条素材库记录。 4. 如需增加唯一索引,先检查存量重复数据: - staging 的测试重复数据可清理; - 生产重复数据只输出清单和合并/清理方案,不自动删除。 5. 补充并发和重试测试。 ## 验收标准 - 同一用户连续/并发调用 10 次,只创建 1 个默认项目和 1 个默认素材库。 - 上传失败重试不会产生第二个空项目/空素材库。 - 不同用户各自拥有独立默认项目。 - 唯一约束冲突时接口返回已有记录,不报 500。 - PR 目标分支为 `develop`,禁止合并 `main`。
Author
Owner

已完成。PR #1783(feat: DB 唯一约束兜底)+ PR #1784(fix test)已合并 develop。getOrCreateDefaultProject 改为 upsert,DB 层 unique(user_id, is_default) 兜底防并发。

已完成。PR #1783(feat: DB 唯一约束兜底)+ PR #1784(fix test)已合并 develop。getOrCreateDefaultProject 改为 upsert,DB 层 unique(user_id, is_default) 兜底防并发。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoxia/xiaoxia-saas#1775