2015-08-14 77 views
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; 
} 
+0

如果您將'is_in_use'字段從標誌更改爲某種類型的「consumer_id」,則可以在更新後重新檢查該值以確認。 (另外,'resource.id'是唯一的或主鍵,對嗎?) – Uueerdo

回答

0

這可能不是你要找的完整的答案,但有你的代碼的一些改進。給出如下嘗試:

public function useResource() { 
    $mysqli = secureMysqli(); 
    // add `` backticks around table and column names to prevent mysql reserved words error 
    if ($stmt = $mysqli->prepare("UPDATE `resource` SET `is_in_use` = 1 WHERE `is_in_use` = 0 AND `id` = ?")) { 
     $stmt->bind_param('i', $this->id); 
     $stmt->execute(); // No need to check if is executed. 

     if($mysqli->affected_rows == 1) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return false; 
} 

如果你想檢查是否正確執行您的查詢添加:

if(!$stmt){ 
    echo $mysqli->error; 
} 

可以每$stmt號召下也是如此下添加準備,結合這一權利並執行語句

相關問題