【发布时间】:2014-11-18 05:34:25
【问题描述】:
我正在为远程“工作”机器构建一个 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 语句的结果记录提供给工作人员。这会阻止同时请求工作人员获得显示给他们的相同记录吗?我不确定 MySQL 如何处理 UPDATE 查询中的查找,以及两个 UPDATES 是否可以“找到”相同的记录,然后按顺序更新它。如果可行,是否有更优雅或更标准化的方式来执行此操作(不确定是否需要将 FOR UPDATE 应用于此)?谢谢!
【问题讨论】:
标签: php mysql concurrency task