全部文章
工具笔记

让 AI 修注册竞态:两次请求只能成功一次

让数据库唯一约束处理并发下的最后一步。

资料核验2026.11.12 · PostgreSQL · 以部署版本文档为准

注册接口先查用户名,再插入记录。两次并发请求都能在插入前查到空结果,于是两个请求都以为名字可用。前置检查可以给人更早的提示,但它和写入之间还有一个窗口。

让助手从这一步开始

给助手一个带先查后插的注册入口和两条同名请求。要求它用测试库复现竞争,再用数据库约束守住写入点。应用层把约束错误映射为已有的名称冲突提示。

流程示意:两个请求均通过前置查询;写入竞争;唯一约束裁决

把规则落在写入发生的地方

给用户名设置唯一约束。如果大小写要视为相同,先明确规范化规则,保证检查与约束用同一种身份。插入失败后,把唯一冲突转换成可理解的提示。

验收时使用两个连接同时提交同一名字。应当只有一条记录成功,另一个请求得到名称已占用的响应。

已经有历史数据时,先找重复项,再建约束。清理规则需要业务确认,不能按创建时间随便保留一条。

把问题变成可重跑的样例

两个连接同时注册名字 miao-test。测试前确保这个名字不存在,结束时执行计数查询并核对请求结果。若约束依赖规范化键,再加一对大小写不同但应视为同名的样例。

核对这几项输出

  • 同时提交后只有一条记录。
  • 失败请求能读懂原因。
  • 普通不同名注册仍成功。
  • 大小写按产品明确的规范化规则判断。

怎么判断改动能不能收

如果助手只在应用再查一次,竞争窗口仍存在。用两个连接触发并发,再在数据库回读实际结果。迁移前先列出现有重复记录,如何合并由业务规则决定。

约束错误处理不要按数据库返回的完整英文字符串匹配。让助手用部署驱动可得到的错误代码和约束身份判断,再核对别的约束错误不会被误报为名字被占用。用同一 API 看冲突和正常路径的状态。

资料来源