0
我有一個表,其中每一行代表一個消費者可以使用的資源。該資源只能由一位消費者隨時使用。消費者選擇可用資源並隨機挑選一個。爲了確保消費者可以使用它選擇的資源,我有以下SQL語句:UPDATE resource SET is_in_use=1 WHERE is_in_use=0 AND id=?
MySQL UPDATE語句沒有像預期的那樣鎖定行
如果受影響的行數= 1,我認爲這意味着消費者會獨佔使用該資源。並非如此。我偶爾會遇到將多個消費者分配到單一資源的情況。
完整的PHP代碼:
public function useResource() {
$mysqli = secureMysqli();
if ($stmt = $mysqli->prepare("UPDATE resource SET is_in_use=1 WHERE is_in_use=0 AND id=?")) {
$stmt->bind_param('i', $this->id);
if($stmt->execute())
{
if($mysqli->affected_rows == 1) {
return true;
} else {
return false;
}
} else {
return false;
}
}
return false;
}
如果您將'is_in_use'字段從標誌更改爲某種類型的「consumer_id」,則可以在更新後重新檢查該值以確認。 (另外,'resource.id'是唯一的或主鍵,對嗎?) – Uueerdo