2016-09-18 21 views
1

我正在开发一个流量很大的呼叫中心IVR系统。我想给每个来电者一个随机的免费代表聊天。MySQL块选择/读取特定行

我现在做的是:

SELECT admin FROM admins WHERE live = 1 AND available = 1 ORDER BY RAND() LIMIT 1 

后,我获得免费的代表,我向他汇报不可用像这样:

UPDATE admins SET available = 0 WHERE admin = XXX 

测试之后,我发现比呼叫者有时结束如果他们几乎在同一时间打电话,同时与同一位代表联系。

我已经尝试在选择查询中添加“FOR UPDATE”,但它并不真正帮助锁定选择行。

任何想法如何接近这个问题?

回答

1

这被称为竞赛条件。一种方法是锁定表格,但这会降低速度。另一个想法是在同一时间做更新和获取ID:

UPDATE admins 
    SET available = if(@id := admin, 0, 0) 
    WHERE live = 1 AND available = 1 
    ORDER BY RAND() 
    LIMIT 1; 

SELECT @id; 

这将返回受影响的行的id