我正在为远程“工作”机器构建一个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应用于此)?谢谢!
答案 0 :(得分:0)
没关系我以前的回答。我相信我明白你在问什么。我会改写它,所以也许对其他人来说更清楚。
"如果我同时发布上述两个更新声明,会发生什么?"
根据http://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html,第二个陈述不会干扰第一个陈述。
通常,您不需要锁定表,因为所有单个UPDATE 陈述是原子的;没有其他会话可以干扰任何其他会话 当前正在执行SQL语句。
更优雅的方式可能是基于意见的,但我不会发现你正在做的事情有什么问题。