您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。
免責(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)容。