您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關使用thinkPHP框架怎么實現樂觀鎖和悲觀鎖,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
樂觀鎖:
例子對于一個正在出售的火爆商品,同一個時間,同時有10個人同時發起了10個線程來購買,10個線程讀取到數據庫的庫存有20件和version為9。
那么樂觀鎖讀取num數量和version版本兩個字段,在更新的結果時候,我們就要更新條件where version=9這條語句,具體UPDATE goods SET num=num-1,version=version+1 WHERE version=9 and id=1,這樣的話,如果其中一條執行成功后,數據庫中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; }
樂觀鎖缺點:
比如可能別人先購買的,反而后面的先買到了,這就點不太合理
樂觀鎖優點:
這可以避免超發的現象發生
悲觀鎖mysql代碼:
#主要對所在行進行for update select * from employee where id = 1 for update; update employee set money = 0 + 1 where id = 1;
看完上述內容,你們對使用thinkPHP框架怎么實現樂觀鎖和悲觀鎖有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。