MySQL,PHP:在更新之前检查竞争条件

时间:2017-02-14 13:10:38

标签: php mysql

我在名为status的表中有一个列(让我们称之为A),我根据用户操作更新。列A保持状态为整数。当用户请求状态时,我向字段A写入1,而当用户确认(通过按UI上的确认按钮)读取值(代码)时,我写入2。但是我有一个条件,如果任何用户已经确认了该值,那么我需要阻止更新表,而是向用户报告错误说"此值已经被确认"。

目前在我的PHP代码中为了防止多个用户更新该值,我从表中读取(步骤1)A的值,并且只有当值不是2时才会立即写入更新值的表(第2步)。

$status = $code->getStatus($id); //Step1
if($status!=2) {
  $code->updateStatus($id); //Step 2
}else{
  echo "This value has already been confirmed";
}

然而,如果第一个请求尚未执行第二步并且新请求已经执行,则另一个确认值(因此更新值为2)的请求就会出现,我担心的是步骤1.执行步骤1的请求2将$ status返回为1并因此执行步骤2导致覆盖。我如何在PHP或MYSQL中阻止这种情况,因为我会有很多用户?

1 个答案:

答案 0 :(得分:3)

为什么不检查UPDATE查询中的状态值?

UPDATE `table` SET `status` = 2 WHERE `id` = 123 AND `status` = 1

然后检查受影响行的数量 - 如果它大于零,则表示已成功执行更新。如果没有,则可能有两种原因:找不到idstatus未找到。{/ p>