UPDATE cs_sessions SET agent_id = 27, status = 'serving' WHERE id = 1024 AND agent_id IS NULL; -- 影响行数为 1 才算接入成功
客服 A 和客服 B 的列表同时弹出同一个访客,两边都点了接入,用户那边看到两个人在回消息,一前一后互相打断。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,分配逻辑是先查出空闲客服,再更新会话表,两步之间没有事务也没有条件判断。两个请求同时读到同一条空闲记录,后写的覆盖先写的,结果两个客服都认为自己接上了。
「客服会话抢占」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:把更新改成带条件的,客服字段为空才写,用影响行数判断谁抢到;抢不到的那一方重新走分配,别直接提示失败;会话表给会话号和客服加唯一索引,兜住漏网的并发。
改完只确认一件事:两个客服同时点接入,只有一个进入会话,另一个自动拿到下一条。
