對一條資料加了讀鎖的情況下,這條資料有且只有新增讀鎖。排它鎖、寫鎖是不行的
對一條資料加了寫鎖的情況下,這條資料不能新增寫鎖或者讀鎖。
鎖分類概述
樣例使用場景
悲觀鎖悲觀鎖對資料被外界修改持有保守狀態(悲觀的)
因此在整個資料處理過程中,將資料處於鎖定狀態
往往依靠資料庫提供的鎖機制實現。
可以理解為:悲觀鎖,態度是悲觀的,總是認為資料
在處理的時候會造成衝突,所以會把要修改的資料鎖定
行鎖,頁鎖,表鎖,共享鎖(讀鎖)
排它鎖(寫鎖)
寫多,讀少
保證資料安全
樂觀鎖樂觀鎖認為資料在處理的過程中不會造成衝突
所以在資料進行提交更新的時候,才會正式對
資料的衝突與否進行檢測,如果發生衝突,則
返回錯誤資訊給使用者,讓使用者決定如何去做
資料庫樂觀鎖,快取樂觀鎖
讀多,寫少,提高吞吐量
樂觀鎖吞吐量高的原因:只有在更新那條資料的一瞬間才會鎖表
資料庫樂觀鎖實現方案:
優點:簡單高效,穩定可靠
缺點:併發能力低
1、通過版本號實現
修改表結構,新增version 版本號列。每次去更新庫存的時候版本號+1。
update goods_info set amount = amount - # , version = version + 1
where code = # and version = #
2、通過狀態控制
判斷庫存減去購買量大於0
update goods_info set amout = amout - #
where code = # and amout-# >0
快取樂觀鎖實現方案:
使用cas(compare and swap)機制
步驟分析:讀取資料--->比較資料---->更新資料
場景分析:秒殺場景
秒殺的特點:
1、讀多寫少:比如搶票,200張票6000人來搶
2、短時高併發、負載壓力大
3、資源競爭有限,不能多賣,不能少賣,不能重賣
根據秒殺特點可以選用樂觀鎖來控制庫存操作。
service-----修改庫存方法流程:
獲取商品庫存物件---獲取商品庫存---判斷庫存是否足夠(庫存是否小於當前購買量)--獲取版本號
---帶上版本號更新庫存---更新失敗的當前執行緒休眠(休眠時間隨機)---遞迴呼叫修改庫存方法
基於快取實現秒殺---實現cas機制
悲觀鎖樂觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖 悲觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...
樂觀鎖 悲觀鎖
樂觀鎖 悲觀鎖 悲觀鎖 pessimistic locking 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保...