php - MySQL、PHP : Check Race condition before update

标签 php mysql

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

目前在我的 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 时,如果另一个请求确认值(并因此将值更新为 2)进来怎么办。请求 2 已经执行了步骤 1将 $status 返回为 1 并因此移动到执行步骤 2 导致覆盖。鉴于我将有大量用户,如何在 PHP 或 MYSQL 中防止这种情况?

最佳答案

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

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

然后检查受影响的行数 - 如果它大于零,则更新已成功执行。如果不是,有两个可能的原因:未找到 idstatus 不是 1。

关于php - MySQL、PHP : Check Race condition before update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227069/

相关文章:

php - 使用 Sphinx 搜索多个全文字段

javascript - 如何将用sketch.js修改的html Canvas 保存到MySQL数据库中

php - 内连接 MYSQL 查询组合 3 个表

javascript - 如何在javascript中添加php

php - 加载 SQL DLL PHP 5.6.32 时出现问题

PHP Dropdown mySQL 两张表

mysql - sql bool 真值测试 : zero OR null

mysql - 自定义从 dbname 显示表状态的结果

mysql - 在 MySQL 命令行中,如何防止数据值中出现的新行在 SELECT 期间导致控制台输出中出现新行?

php - PHP 等式(== 双等式)和恒等式(=== 三等式)比较运算符有何不同?