我的表中有一个名为状态的列(我们称之为 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
然后检查受影响的行数 - 如果它大于零,则更新已成功执行。如果不是,有两个可能的原因:未找到 id
或 status
不是 1。
关于php - MySQL、PHP : Check Race condition before update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227069/