PHP MySQL Task API,防止重复记录

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

最佳答案

别管我之前的回答了。我相信我明白你在问什么。我会改写它,这样其他人可能会更清楚。

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

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

Normally, you do not need to lock tables, because all single UPDATE statements are atomic; no other session can interfere with any other currently executing SQL statement.

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

关于PHP MySQL Task API,防止重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987308/

相关文章:

java - BufferedImage 的后台创建以及与信号量的同步

PHPExcel 下载无法正常工作

mysql - 在选择语句中使用月份(日期)时出现sql左连接错误

testing - docker-compose 与孤立的服务集一起运行?

java - 具有与输入处理方法分离的 setter/getter 的类是否可以被视为 "thread-safe"?

mysql - 在 MySQL 中添加带小数的数字返回四舍五入的数字

php - MySQL 和 PHP 错误 : Column count doesn't match value count at row 1

php - 如何在 codeigniter 中使用 PHP 为 CRUD 等功能创建用户规则

php - 复制字符串php的特定部分

php - 将已弃用的 PHP SQL 命令转换为 PDO