[M-AI-06-02] 支持事务内创建 AiJob Child Job、Snapshot 与 Outbox #313
Closed
opened 2026-06-21 18:13:12 +08:00 by wangdl
·
1 comment
Labels
Clear labels
adr
Area: adr
architecture
Area: architecture
area:activity
活动/统计
area:admin
管理后台
area:admin-api
area:ai
AI/RAG
area:ai-runtime
AI Runtime / AI 分析体系相关
area:analytics
area:api
API 接口
area:auth
认证与授权
area:cos
对象存储
area:database
数据库/Migration
area:import
文件导入/解析
area:knowledge
知识库/知识点
area:learning-info
area:learning-session
area:quiz
测验/自测
area:reading-event
area:reading-progress
area:review
复习系统
area:security
安全相关
audit
Area: audit
audit:api-admin-info
audit:api-info
audit:planned
已完成宏观规划,尚未代码审查
audit:reviewed
backend
Area: backend
billing
Area: billing
blocked-by:api-info-aggregation
blocked-by:api-info-core
blocked-by:api-info-ops
blocked-by:api-info-schema
blocked-by:processor
blocked-by:schema
compatibility
Area: compatibility
gate
Area: gate
infrastructure
Area: infrastructure
priority:p0
最高优先级,阻塞发布
priority:p1
高优先级,里程碑必需
priority:p2
中优先级,后续版本
prisma
Area: prisma
release
Area: release
repo:api
API 仓库 Issue
status:blocked
被阻塞
status:done
已完成
status:partial
status:todo
type:aggregation
type:bug
缺陷修复
type:design
设计
type:docs
文档
type:feature
新功能
type:migration
type:refactor
重构
type:test
work:admin-api
work:aggregation
work:api
work:artifact
题目/卡片产物
work:audit
work:circuit-breaker
熔断
work:contract
work:design
架构/协议设计工作
work:docs
work:export
work:extend-existing
work:internal-api
Runtime 内部接口
work:job
Job 调度相关
work:new-module
work:new-table
work:ops
work:query
work:quota
额度/限流
work:schema
Prisma Schema 设计
work:security
work:service
Service 层实现
work:snapshot
Snapshot 构建
work:test
No Label
Milestone
No items
No Milestone
M-AI-06 Feynman ReviewCard 子 Job 与可靠生成
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: wangdl/api-server#313
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
类型 / 标签
风险等级
P0 — 非原子创建会导致 Child Job 丢失,Parent 成功但无 ReviewCard
依赖
目标
为 Parent Projector 提供统一、可复用的事务内 Child Job 创建能力。
建议接口
根据现有代码调整,语义应类似:
该方法必须复用现有:Registry 校验、Definition 元数据、幂等键、Snapshot 创建、Outbox 创建、Job 默认状态、公共字段校验。
禁止复制一份简化版创建逻辑到 FeynmanProjector。
同一事务创建
必须完成:AiJob、AiJobSnapshot、OutboxEvent。
Child Job 必须包含:parentJobId、jobType = review_card_generation、triggerType = child_job、targetType、targetId、idempotencyKey、queueName。字段值最终以 01 契约为准。
幂等
重复调用相同 userId + jobType + idempotencyKey 必须返回同一个 Child Job。
注意:P2002 后必须在同一事务语义下安全读取已有 Job;不得导致外层 Parent Transaction 进入不可恢复状态;需要根据 Prisma/MySQL 实际事务行为实现;不得只在内存中去重。
禁止嵌套独立事务
createInTransaction 内禁止调用 this.prisma.$transaction(...),必须使用传入的 tx。
回归
现有普通 AiJobCreationService.createJob() 仍应保持原行为,可以内部复用新的事务方法。
测试
至少验证:
约束
验收标准
建议执行顺序
第 2 个执行(依赖 01 契约,可与 01 审计并行启动技术设计)
开发完成评论
完成内容
createInTransaction(tx, input)方法:支持在外部 Prisma 事务中创建 Child Job + Snapshot + Outbox,不自行开启事务createJob方法:提取createCore()/resolveAndValidate()/buildSnapshotContent()三个私有方法,createJob和createInTransaction共享核心创建逻辑createInTransaction采用 check-before-create(事务内findUnique),避免 P2002 污染外部事务;createJob保留 P2002 catch 回退createCore()统一路径createInTransaction要求retrySnapshotContent(Snapshot 需在事务外预构建),缺失时抛出BadRequestException修改文件
src/modules/ai-job/ai-job-creation.service.ts:12— 新增import type { JobDefinition }:68-109—createJob重构为委托resolveAndValidate()+buildSnapshotContent()+createCore():111-169— 新增createInTransaction(tx, input)方法(含 check-before-create 幂等):171-230— 新增 三个私有方法:createCore()(:180),resolveAndValidate()(:216),buildSnapshotContent()(:225)src/modules/ai-job/ai-job-creation.service.spec.ts:345-559— 新增describe('createInTransaction')测试块(9 个测试)代码证据
ai-job-creation.service.ts:180-215—createCore()是唯一的创建路径,createJob和createInTransaction均通过它写入ai-job-creation.service.ts:132-147—createInTransaction中 check-before-create(findUniquebeforecreateJob),防止 P2002 污染外部事务ai-job-creation.service.ts:68-109—createJob重构为打开自己的$transaction后调用createCore,保留 P2002 catch 回退ai-job-creation.service.ts:182-196—createCore调用lifecycleRepo.createJob(tx, ...)+tx.aiJobSnapshot.create(...)+outboxRepo.createInTransaction(tx, ...)— 全部使用传入的 txai-job-creation.service.spec.ts:354-406— 测试验证createInTransaction不自行开启$transactionai-job-creation.service.spec.ts:438-468— 测试验证幂等返回已有 Job,不创建新 Job/Snapshot/Outbox测试情况
ai-job-creation.service.spec.ts: 19 passed(10 旧 + 9 新增), 0 failed未完成 / 风险
createInTransaction是纯扩展,不改变现有createJob行为是否建议进入 Review