我有以下算法:
- 选择没有答案且未锁定的行(状态 0)
- 锁定此行以防止其他人获取它(状态 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/