溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用thinkPHP框架怎么實現(xiàn)樂觀鎖和悲觀鎖

發(fā)布時間:2021-04-13 16:19:19 來源:億速云 閱讀:379 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)使用thinkPHP框架怎么實現(xiàn)樂觀鎖和悲觀鎖,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

樂觀鎖:

例子對于一個正在出售的火爆商品,同一個時間,同時有10個人同時發(fā)起了10個線程來購買,10個線程讀取到數(shù)據(jù)庫的庫存有20件和version為9。

那么樂觀鎖讀取num數(shù)量和version版本兩個字段,在更新的結(jié)果時候,我們就要更新條件where version=9這條語句,具體UPDATE goods SET num=num-1,version=version+1 WHERE version=9 and id=1,這樣的話,如果其中一條執(zhí)行成功后,數(shù)據(jù)庫中version的值為10了,所以剩下的9個人線程都會失敗了。

$result = $this->mysqli->query("SELECT num,version FROM goods WHERE id=1 LIMIT 1");
$row = $result->fetch_assoc();
$num = intval($row['num']);
$version = intval($row['version']);
if($num > 0){
  usleep(100);
  $this->mysqli->begin_transaction();
  $this->mysqli->query("UPDATE goods SET num=num-1,version=version+1 WHERE version={$version} and id=1");
  $affected_rows = $this->mysqli->affected_rows;
  if($affected_rows == 1){
    $this->mysqli->query("INSERT INTO log(good_id) VALUES({$num})");
    $affected_rows = $this->mysqli->affected_rows;
    if($affected_rows == 1){
      $this->mysqli->commit();
      echo "success:".$num;
    }else{
      $this->mysqli->rollback();
      echo "fail1:".$num;
    }
  }else{
    $this->mysqli->rollback();
    echo "fail2:".$num;
  }
}else{
  echo "fail3:".$num;
}

樂觀鎖缺點:

  • 比如可能別人先購買的,反而后面的先買到了,這就點不太合理

樂觀鎖優(yōu)點:

  • 這可以避免超發(fā)的現(xiàn)象發(fā)生

悲觀鎖mysql代碼:

#主要對所在行進行for update
select * from employee where id = 1 for update; 
update employee set money = 0 + 1 where id = 1;

看完上述內(nèi)容,你們對使用thinkPHP框架怎么實現(xiàn)樂觀鎖和悲觀鎖有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI