【问题标题】:PHP MySQL Task API, Prevent Duplicate RecordsPHP MySQL Task API,防止重复记录
【发布时间】: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


    【解决方案1】:

    别介意我之前的回答。我相信我明白你在问什么。我会改写它,以便其他人更清楚。

    “如果我同时发出上述两个更新语句,会发生什么?”

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

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

    一种更优雅的方式可能是基于意见的,但我认为您的操作没有任何问题。

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多