PHP MySQL任务API,防止重复记录

时间:2014-11-18 05:34:25

标签: php mysql concurrency task

我正在为远程“工作”机器构建一个PHP RESTful-API来自行分配任务。 API主机上的MySQL InnoDB表保存了待处理的记录,工作人员可以在准备好处理记录时从API中获取这些记录。如何防止并发请求的工作系统获得相同的记录?

我的初步计划是在默认的NULL字段中使用唯一生成的ID更新单个记录,然后轮询唯一ID字段匹配的记录的详细信息。

例如:

UPDATE mytable SET status = 'Assigned', uniqueidfield = '3kj29slsad' 
WHERE uniqueidfield IS NULL LIMIT 1

在同一个PHP实例中,下一个查询:

SELECT id, status, etc FROM mytable WHERE uniqueidfield = '3kj29slsad'

然后将上面SELECT语句的结果记录提供给worker。这会阻止同时请求工人获得向他们显示的相同记录吗?我不确定MySQL如何处理UPDATE查询中的查找,以及两个UPDATES是否可以“找到”相同的记录,然后按顺序更新它。如果这样可行,是否有更优雅或标准化的方法(不确定是否需要FOR UPDATE应用于此)?谢谢!

1 个答案:

答案 0 :(得分:0)

没关系我以前的回答。我相信我明白你在问什么。我会改写它,所以也许对其他人来说更清楚。

"如果我同时发布上述两个更新声明,会发生什么?"

根据http://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html,第二个陈述不会干扰第一个陈述。

  

通常,您不需要锁定表,因为所有单个UPDATE   陈述是原子的;没有其他会话可以干扰任何其他会话   当前正在执行SQL语句。

更优雅的方式可能是基于意见的,但我不会发现你正在做的事情有什么问题。