三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Agent 一接批量导入就开始覆盖他人数据:从 Batch Scope 到 Row Commit Proof 的工程实战

Agent 一接批量导入就开始覆盖他人数据:从 Batch Scope 到 Row Commit Proof 的工程实战

一、为什么批量导入是 Agent 的高危场景

🚨 凌晨两点,某企业后台数据看板飘红。两个运营 Agent 同时执行客户名单批量导入,一方的数据被完全覆盖,次日营销活动发给了错误客群,直接损失六位数。

这类事故不少见。在 Agent 流程里,批量导入比单条编辑更危险:单条操作天然带行级隔离,批量任务却常被当成"原子黑盒",内部每行 Scope 被忽略。区间一旦重叠,覆盖就在所难免。

图1:多 Agent 并发导入导致的数据覆盖示意

1.1 生产事故的复盘

📋 该系统导入流程原本简单:Agent 读取 CSV → 校验 → 逐行 upsert。问题出在应用层只做任务去重,没有判定"数据行交集"。Agent A 更新了第 100 到 200 行,Agent B 随后用旧快照写入同一区间,前者的修改被抹掉。

1.2 根因:Scope 缺失

⚠️ 系统只回答了"谁在导入",没有回答"哪些行正在被谁改"。没有 Row Scope 的批量导入就像多人同时编辑无锁表格,最后保存的人 wins。在自动化场景下更加致命,Agent 不会看到冲突后手动合并。

二、三种方案的演进

💡 思路不是禁止并发,而是让并发具备可验证的隔离语义。

2.1 全局锁(最慢但最安全)

🔒 导入前获取分布式全局锁,任务结束释放。实现简单,但吞吐量归零。实测单任务平均 12 秒,全局锁导致 P99 延迟飙升到 180 秒。

方案并发度P99 延迟实现复杂度数据安全
全局锁1180s+
Row Lease6418s
Row Commit Proof6422s中高极高

图2:三种并发控制策略的粒度对比

2.2 Row Lease(细粒度隔离)

🎯 锁粒度从"整个任务"降到"具体数据行"。导入前 Agent 向协调器申请目标行 Lease,持有期间其他 Agent 无法获取相同行写入权。

classRowLeaseManager:defacquire(self,agent_id:str,row_keys:list,ttl:int=30):locked=[]forkeyinrow_keys:ok=self.redis.set(f"lease:{key}",agent_id,nx=True,ex=ttl)ifok:locked.append(key)returnlocked

Row Lease 提升了并发度,但仍有漏洞:Lease 过期后 Agent 可能还在写数据,存在窗口期风险。

2.3 Row Commit Proof(终态可验证)

🛡️ 核心思想是:提交时不只看"谁持有锁",还要看"版本是否与读取时一致"。每行带单调递增row_version,提交时带expected_version,数据库用原子 CAS 完成更新。

defcommit_with_proof(agent_id:str,rows:list)->CommitResult:succeeded,failed=[],[]forrowinrows:updated=db.execute(""" UPDATE customers SET name = :name, version = version + 1 WHERE id = :id AND version = :expected_version """,row)ifupdated:succeeded.append(row["id"])else:failed.append(row["id"])returnCommitResult(succeeded,failed)

如果expected_version不匹配,说明该行在读取后被其他 Agent 修改过,提交被拒绝,系统可触发重试或人工介入。

三、实战性能对比

📊 在日均导入 200 万行的 CRM 系统里,三种方案 A/B 结果如下:

指标全局锁Row LeaseRow Commit Proof
峰值 QPS8210195
冲突重试率0%3.2%4.1%
数据一致性极强
故障恢复成本

🔄 Row Commit Proof 的 QPS 略低于 Row Lease,原因在于每次写入需多一次 version 比对。换来的是零覆盖风险,这个 trade-off 完全值得。

图3:三种方案在真实业务负载下的吞吐对比

四、为什么不是乐观锁

传统乐观锁只保护"单行更新",Row Commit Proof 保护的是"Agent 批量导入的整批数据终态一致性"。它不仅比对 version,还比对整批内容指纹,确保 Agent 在读取、决策、写入链条中没有外部干扰。

此外,Commit Proof 天然支持冲突后的策略选择:可以重试、降级为单行人工审核,也可以把冲突行输出到旁路队列供后续合并。这种灵活性是数据库原生乐观锁无法提供的。

五、趋势判断

未来 3 到 6 个月,批量操作的一致性协议会从"事后补救"转向"事前预防"。两个方向值得注意:

一是Batch Intent 提前注册。Agent 在执行导入前,先把意图注册到共享 Intent Graph,其他 Agent 可主动规避冲突区间,而不是等到提交时才撞车。

二是Merge-Aware Agent。当冲突不可避免时,Agent 本身具备自动合并能力,利用 LLM 对语义冲突进行智能消解。这对数据质量要求极高的场景有意义。

📌 核心建议:如果你的系统还在用全局锁做批量导入,优先升级到 Row Lease;数据安全是红线时,直接落地 Row Commit Proof。不要在"简单实现"和"数据正确"之间妥协。

以上就是对 Agent 批量导入一致性问题的完整分析。你在实际工程中遇到过哪些批量操作的数据覆盖事故?欢迎在评论区分享你的经验。如果这篇文章对你有所帮助,别忘了点赞收藏,后续会持续更新更多 AI Agent 工程稳定性的深度解析。关注我带你玩转 AI。

← 返回列表