# 597084 统一修复独立复审（第一轮）

规格：FAIL。代码质量：FAIL。需修正下列 5 项后定向复核；未把 AST 通过或未运行 Maven 当作类型正确/错误的证据。

范围：以 DESIGN.md、PLAN.md、issues-baseline.json 的 17 正式 + 2 条件问题为标准，读取统一补丁并核对新增接口实现、现有生产调用、MyBatis ID 拦截器、MQ 同步入口和事务边界。未改 code/，未执行 Maven、业务 DB 或 MQ。部分已由主审提示的问题经独立源码核实后纳入。

## R1 [P1 阻断] 题级行锁 SQL 使用了不存在的删除字段

位置：`code/infrastructure/repository/src/main/java/cn/jojo/cc/core/dao/english/QuestionSegmentDao.java:19`。

新增 lockQuestion 查询 `cc_new_question ... delete_time = 0 FOR UPDATE`。真实 QuestionDo 继承 AbstractDo，删除字段是 `delFlag`；既有 SegmentRefreshBizServiceImpl:269 也明确并实际按 del_flag 查旧题表。delete_time 属于新的 cc_question_segment，不能套到旧题表。

可达情形：任何同步 hook、分词刷新、成对骨架保留调用 lockQuestion 都执行该 SQL，产生 Unknown column。同步路径还会触发 R2 的整体回滚，SEG01/02/03 不能运行。

反证：分词表自身的 delete_time 条件正确；问题仅锁定 cc_new_question 的新增 SQL，不是全部 DAO。

建议：改用真实 del_flag 条件，并以真实题表 schema 校验 SQL；为锁入口补最小数据库契约验证，不能仅 stub lockQuestion。

## R2 [P1] 新增 REQUIRED 派生事务重新让分词故障拖垮 LABS 同步

位置：`code/application/src/main/java/cn/jojo/cc/biz/service/english/segment/QuestionSegmentSaveHookService.java:68`；`QuestionSegmentStateTxService.java:16-24`。

QuestionBizServiceImpl.questionBackFill:5678 有事务，在表单写入后 :5757 调用 hookSave。新增 invalidateAfterSave 为默认 REQUIRED，会加入同步事务；reserveIdentity / invalidateQuestion 失败向外抛出并将事务标记 rollback-only。此前提交后派生失败不影响主链路的隔离已经丢失。即使只在 hook 外 catch，也不能清除 rollback-only。

可达情形：分词表迁移缺失、分词行锁超时或派生写入失败；目前 R1 也会无条件触发。结果是本应保存的题目/表单被回滚。

反证：MQ 发送仍在 AFTER_COMMIT 且 catch，MQ 单独失败不回滚；问题在新加的提交前数据库调用。

建议：恢复主链与派生计算故障隔离，同时用正文版本/指纹读门保证旧分词不可下发；不得只删除失效写而重新打开 SEG02。新边界需覆盖派生表不可用时题同步成功、下发不给旧序列两条验收。

## R3 [P2] 失败登记与计算事务一起回滚，旧 NORMAL 得以保留

位置：`code/application/src/main/java/cn/jojo/cc/biz/service/english/segment/QuestionSegmentBizServiceImpl.java:204-218,319-321`。

三个公开入口新增 rollbackFor=Exception 的事务；catch 仍先 registerFailure，再 throw e。registerFailure 使用同一 CoreService/连接写 FAILED，随后异常退出代理时整笔回滚。失败状态、retry_count、last_error 全部丢失。

可达情形：每日 force 刷新已有 NORMAL 的题，抽取或匹配失败；登记 FAILED 后外层回滚，数据库仍保留 NORMAL 和旧序列。首次失败也不能持久化 FAILED 诊断。该问题修复 R1 后仍存在。

反证：正常完成的结果落库和跨内容位删除确实由同一题锁事务保护；问题仅异常收口。不能在持有题行锁时简单 REQUIRES_NEW 重锁同题，可能自锁等待。

建议：计算事务回滚并释放锁后，独立事务锁题、重读 revision，确认未被新版本替代再登记失败；或明确失败返回契约让状态提交、由事务外传播异常。

## R4 [P2] PROD 旧序列降级仍晚于正文提交，SEG02 正式库窗口未闭合

位置：`code/application/src/main/java/cn/jojo/cc/biz/service/english/segment/QuestionSegmentStateTxService.java:35-49`；`code/application/src/main/java/cn/jojo/cc/biz/service/impl/question/library/QuestionBizServiceImpl.java:1815`。

降级仍只在发布完成后的 published -> ensureProdSegmentSkeletons -> ensurePair 中发生。publishQuestion 明确先 doPublishQuestion 事务完成，再逐题执行 published；旧 NORMAL 与新正文可以在后置处理前同时可见。后置处理失败/进程退出则窗口延长。EnglishSegmentDeliveryBizService:143 仍只验 NORMAL，没有正文版本/指纹一致性门。

可达情形：已有正式 NORMAL 行，发布新正文，暂停 published 后置处理或在其前置副作用异常；读取正式题即可得到新正文配旧序列。

反证：后置处理正常完成且 revision 不同确实会降级；没有证据把 QuestionDo revision 认定为秒级，因此本项不依赖“同秒碰撞”推断。

建议：把失效与正式正文提交绑定，或在下发侧核对可靠正文版本/指纹。和 R2 一起设计，不能把可选派生表故障扩散为主发布失败。

## R5 [P1] 自动补录新发布闸门仍把同秒人工编辑当作未编辑

位置：`code/application/src/main/java/cn/jojo/cc/biz/service/english/dict/EnglishPublishBizServiceImpl.java:137-143`。

publishAutoFillWord 新入口在实体锁内只以 createTime==updateTime 证明未编辑。EnglishDictWriteTxService.saveWord:83 明确取秒级 now，:98 保留原 SEGMENT_AUTOFILL source，:101 置 UNPUBLISHED；DomainBaseV3Do.fillRequired 直接写该秒值，不保证严格递增。

可达情形：补录在秒 S 建词，自动发布尚未拿到实体锁；人工在同一秒 S 保存新翻译/音频后释放锁。锁内重读仍满足 source=AUTOFILL、UNPUBLISHED、hasPublished=0、createTime==updateTime，doPublishWord 将人工未审核内容送入 PROD。

反证：人工保存发生在不同秒会被挡；曾发布对象的音频发布 status 闸门正确，此项不是 AUDIO-N01 已有曾发布对象路径，而是新增补录恢复闸门的另一入口。

建议：使用明确的人工编辑标记/严格单调内容版本或创建版本指纹，不以审计秒时间相等充当“未被人工编辑”。补 deterministic 同秒保存竞争用例。

## 其余覆盖评估及边界

- AUDIO-N01/N02/N03/N04/N05：锁内发布状态判定、总超时前置、失败整次累计、跨页游标、完整性与 JY outbox 登记均有实际代码；未发现需另报的确定缺陷。真实 Redis、MySQL 完整性 SQL 和并发音频回填未验。
- SEG01/SEG03：成对身份及题锁思路已接线，R1 阻断执行；失败事务还受 R3 影响。JY reserveIdentity 的无显式 ID INSERT 经真实 IdGenerateSqlInterceptor.interceptM 添加业务 ID，不应误报为无映射裸自增。
- SEG02：受 R2/R4 阻断；不能判闭环。
- SEG04、01、02、03、13、14、23：数字边界、CSV整文件拒绝、非法变体整行拒绝、limit正整数、POS规范化、搜索归一化均见实际写入/调用。已有隔离探针可作为对应函数证据，不扩大到完整服务通过。
- 06：PROD helper 事务内 enqueue；真实 sendN 同步等待生产者 send；失败保留 outbox、Job 双源重放、DDL 均存在。未发现悬空接口，但部署、Broker确认后的消费与数据库路由尚无运行验证。
- 10：先查已有词避免百度重复调用成立；人工草稿保护仍有 R5。
- 条件 IPA/索引：已区分可识别音标与无标记纯ASCII限制，写侧有远端版本一致性门、读侧保留降级。这里不把策略边界或未实跑故障注入写成已验收。
- 新增依赖改变旧 Mockito fixture；旧套件未迁移、未执行的事实应保留在 VERIFICATION 中，不能以探针绿色替代。

无临时 CodeGraph 索引创建，无需本审查清理。
