技术与生活 / 一篇记录
唯一性不能只靠插入前查一下
先查询再插入仍可能遭遇并发竞争,唯一性必须由约束保证。
两个并发请求都可能看到“目前不存在”,随后各自插入。数据库约束在写入时做最终判断,才有机会阻止竞争条件造成的重复记录。
操作与观察
查询示例以 SQLite 为例;notes 为测试表,包含 id、title、score、category、created_at 字段。
CREATE TABLE unique_notes (id INTEGER PRIMARY KEY, slug TEXT UNIQUE);
尝试插入两个相同 slug,确认第二次被拒绝。
准备重复值与空值分别测试约束行为。业务需要某字段始终存在时应加上 NOT NULL;捕获冲突后也要返回可理解的结果,而不是一概重试。
约束冲突应被视为可预期的业务分支之一。记录必要上下文并返回明确提示,通常比连续重试同一条必然失败的插入更合适。重试策略需要区分临时故障与输入冲突。
别遗漏这条边界
需要禁止空值时还应明确 NOT NULL 的语义。
参考:SQL 文档。