SELECT ... FOR UPDATE对并行select语句的影响

时间:2015-06-19 14:15:40

标签: php mysql

(请原谅我的英语,因为我来自瑞士,英语不是我的母语。)

我想我已经阅读了有关我现在将要解释的所有相关主题,但无法找到对我的后续问题/情况的满意答案。

在MySQL表(innoDB)中,我有许多用户,由唯一的user_id标识。

我想最多每60秒为每个用户调用一个外部API,因为API不允许每个用户每分钟有多个请求。

因此,我有包含PHP时间()的列last_api_call int(12)。

现在通过ajax和/或cronjobs,我为那些等待API调用时间最长的用户进行API调用:

> select * from users where last_api_call<time()-60seconds order by last_api_call asc limit 1

> update users set last_api_call=time() where user_id=user_id_from_above_statement

现在session1获取了一个user_id,在session1更新last_api_call之前,session2可能会获得相同的user_id,并且我通过向另一个用户发送两个请求来违反API规则。

在阅读完所有相关主题后,我得出的结论是“SELECT ... FOR UPDATE”解决了我的问题:

session1> > select * from users where last_api_call<time()-60seconds order by last_api_call asc limit 1 FOR UPDATE

问题:session2现在发生了什么?它只是获取下一条记录,还是“等待”直到session1释放记录?它不应该得到相同的记录,因为“last_api_call-60()”不再是mach,所以它应该只使用行中的下一行?!

换句话说,对于session2,row1是通过“select ... for update”锁定只是“不可见”还是等待同一行1被解锁,只是为了看到同一行1与主要不匹配where子句,现在行处理了吗?

0 个答案:

没有答案