ALTER TABLE customer ADD UNIQUE KEY uk_phone (phone); INSERT INTO customer (phone, name) VALUES (?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name);
两个运营几乎同时上传同一份 800 条客户名单,导入都提示成功,客户表按手机号统计多出 800 条重复,后续短信发了两遍。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,代码是先按手机号查一次再插入,两个请求都在对方提交前查到不存在。表上没有唯一约束,数据库层也拦不住这次重复。
「并发导入重复」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:在手机号上建唯一索引 让数据库兜底;插入改成 on duplicate key update 或 insert ignore;导入入口加文件哈希 同一份文件短时间内只允许一个任务。
改完只确认一件事:两个人再同时导入,客户表总数仍是 800,第二次导入的返回里 updated 计数为 800,重复短信没有再发。
