摘要:樂觀鎖樂觀鎖實際上是一種邏輯思想,并不是數據庫的特性。悲觀鎖利用了存儲引擎的支持行鎖的特性。建議在用戶并發量不大的應用場景下,采用樂觀鎖的方式。在對數據一致性要求很高的情況下,可以犧牲一下性能,采用悲觀鎖。
MySQL5.5 版本之后默認采用innoDb 數據引擎.本文采用默認的存儲引擎。樂觀鎖
樂觀鎖實際上是一種邏輯思想,并不是mysql 數據庫的特性。這個要區分清楚。 實現數據版本有兩種方式,第一種是使用版本號,第二種是使用時間戳。
使用方式::
/** 偽代碼 number 庫存 goods_id 商品ID version 版本號默認為0 **/ $sql="select number from goods where goods_id={$goods_id} and version= {$version} "; // 時間戳方式查詢庫存 $sql="select number from goods where goods_id={$goods_id} and time < time() "; $rs=mysqli_query($conn,$sql); $row = $rs->fetch_assoc(); if($row["number"]>0){//高并發下會導致超賣 if($row["number"]<$number){ return insertLog("庫存不夠",3,$username); } //庫存減少 $sql="update goods set number=number-{$number},version += 1 where goods_id={$goods_id} and number>0"; // 時間戳方式減少庫存 $sql="update goods set number=number-{$number},time = time() where goods_id={$goods_id} and number>0"; $store_rs=mysqli_query($conn,$sql); if($store_rs){ //生成訂單,返回操作成功 echo json_encode(array("code"=>0,"msg"=>"庫存減少成功","data"=>$username)); }else{ echo json_encode(array("code"=>1,"msg"=>"庫存減少失敗","data"=>$username)); } }else{ echo json_encode(array("code"=>3,"msg"=>"庫存減少失敗","data"=>$username)); }
悲觀鎖注意:使用樂觀鎖需要注意啊,將庫存字段number字段設為unsigned,當庫存為0時,因為字段不能為負數,將會返回false
悲觀鎖指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處于鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。悲觀鎖利用了MySQL innoDB 存儲引擎的支持行鎖的特性。一行一行操作數據.
使用方式:
// 使用悲觀鎖鎖住當前行 $sql="select number from goods where goods_id={$goods_id} for update "; // 減少庫存操作 $sql="update goods set number=number-{$number} where goods_id={$goods_id} and number>0";
注意:innoDB 行鎖是基于索引來執行的,where 條件后必須有索引,不然走的就是全表掃描。
優點與不足:
悲觀并發控制實際上是“先取鎖再訪問”的保守策略,為數據處理的安全提供了保證。但是在效率方面,處理加鎖的機制會讓數據庫產生額外的開銷,還有增加產生死鎖的機會;另外,在只讀型事務處理中由于不會產生沖突,也沒必要使用鎖,這樣做只能增加系統負載;還有會降低了并行性,一個事務如果鎖定了某行數據,其他事務就必須等待該事務處理完才可以處理那行數樂觀并發控制相信事務之間的數據競爭(datarace)的概率是比較小的,因此盡可能直接做下去,直到提交的時候才去鎖定,所以不會產生任何鎖和死鎖。但如果直接簡單這么做,還是有可能會遇到不可預期的結果,例如兩個事務都讀取了數據庫的某一行,經過修改以后寫回數據庫,這時就遇到了問題。
建議: 在用戶并發量不大的應用場景下,采用樂觀鎖的方式。在對數據一致性要求很高的情況下,可以犧牲一下性能,采用悲觀鎖。這個兩種方式的前提是采用MySQL的解決方案。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31279.html
閱讀 787·2021-11-12 10:36
閱讀 3363·2021-09-08 10:44
閱讀 2739·2019-08-30 11:08
閱讀 1393·2019-08-29 16:12
閱讀 2668·2019-08-29 12:24
閱讀 889·2019-08-26 10:14
閱讀 676·2019-08-23 18:32
閱讀 1160·2019-08-23 17:52