mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 14:31:58 +00:00
c08b2d0d52
复核 L1:catalog_profile_observe.save 和 record_coverage_drops 与这张表的剖析结果、写进目录的结论共用一个事务, 只靠 try/except 记日志。flush 一出错(序列化不了的值、约束冲突)SQLAlchemy 就把整个事务回滚了,异常被吞掉, 外层 catalog_profile._record 提交时抛 PendingRollbackError,整个剖析任务记成「剖析任务出错」,剖析写的目录跟着 丢掉,和模块说明「辅助步骤失败不挡剖析」不符。复现:给一条观察带上序列化不了的值跑 maintenance,任务 failed。 改法: - save:先把剖析这张表自己的写入 flush 下去(那里出错是剖析的事,照常往外抛);读目录一个保存点;每条观察 (落库、修剪、比较、撤销已列全、记变化)挪进 _save_one,各占一个保存点。一条出错只回滚它自己,连同它撤销的 已列全一起回滚,不会只撤了已列全却没有那条变化;别的观察和剖析结果照常提交。 - record_coverage_drops:每条覆盖率下降一个保存点。sc.record 原本只给插入包了保存点,更新已有那一条的改动要到 外层提交时才 flush,出错照样拖垮整个事务。 - _revoke_complete:从库里重读目录(populate_existing)再写,去掉同一事务里撞了重试的循环。catalog.write_entry 乐观锁对不上时回滚的是整个会话、保存点挡不住;会话里握着保存点回滚前的目录对象时(只 refresh 过的干净对象, 保存点回滚不让它过期),拿它的版本去写正好撞上这一条。重读之后别人提交不了新版本:这张表的结果在同一事务里 已经写过,事务拿着 SQLite 的写锁。 测试(test_catalog_observe 新增四条,去掉修复都会失败):观察 flush 报错时剖析结果、目录照常提交、别的观察照常 落库;前一条观察记变化出错时它的撤销一起回滚、后一条照常撤销;覆盖率下降更新出错只回滚它自己;会话握着旧目录 对象时撤销按库里的版本写。