国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL 樂觀鎖于悲觀鎖

liuyix / 3228人閱讀

摘要:樂觀鎖樂觀鎖實際上是一種邏輯思想,并不是數據庫的特性。悲觀鎖利用了存儲引擎的支持行鎖的特性。建議在用戶并發量不大的應用場景下,采用樂觀鎖的方式。在對數據一致性要求很高的情況下,可以犧牲一下性能,采用悲觀鎖。

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

相關文章

  • 并發同步控制

    摘要:并發同步控制遇到并發時,我們避免不了要談并發控制。它會阻塞其它的線程執行,如果當前線程一直持有的監控鎖,就會把其它線程一直阻塞下去。如果此時線程和線程同時進入方法,用一段語言描述方法的執行過程,可能是這樣子。 并發同步控制 遇到并發時,我們避免不了要談并發控制。在Java語言中,我們談并發時,要談到Object的監控鎖。在MySQL的數據庫并發中,我們也要談到mysql的鎖機制。 這樣...

    graf 評論0 收藏0

發表評論

0條評論

liuyix

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<