php - MySQL:同时访问

标签 php mysql

我有以下算法:

  1. 选择没有答案且未锁定的行(状态 0)
  2. 锁定此行以防止其他人获取它(状态 1)

还有状态 2 - 行有答案并已完成。

SELECT * FROM details WHERE RowStatus=0 AND taskid=".$task_id." ORDER BY RAND() LIMIT 1

 UPDATE details SET RowStatus=1 ,Agent='".$_SESSION['username']."' where TaskID=".$row['TaskID']." and RowId=".$row['RowId']

问题是,如果我还剩下 10 行,并且有 8 个代理正在处理该任务,有时他们会在完全相同的时间提交上一行。 然后他们都选择同一行,并且只有一个人用他的名字锁定该行 含义 - 其中一个正在同一行工作。

这听起来像是一个小问题,但不知何故,我在 2500 行任务中发生了 5-10 次这种情况。 有没有办法在选择行的同时锁定该行?阻止其他用户选择该行?

最佳答案

你应该锁定行(当然如果你使用的是InnoDB)。场景如下:

begin;
select ... FOR UPDATE;

doing what you want with task

update selected task

commit;

关于php - MySQL:同时访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904826/

相关文章:

php - 同域多表单认证

php - 随时随地更改数据库名称 php

javascript - 如果之前的进程正常工作,Symfony 不会发送响应

python - 将用户名存储到 mysql [PYTHON]

java - 如何获取 1983 年 1 月 1 日之后加入的部门员工数量

php - 更改表修改列查询结果出现 SQL 语法错误 1064

javascript - 如何在WordPress的functions.php中的google adsense javascript中插入作者元

mysql - 如何在派生表概念中转换此查询

php - 如何根据 codeigniter 模型中最后注册的 ID 设置 session ?

php - 有条件必填的 WooCommerce 结帐字段