應用場景 某一商品的秒殺建立訂單扣減庫存的sql
update考慮未加分布式鎖併發場景下,資料庫中執行扣減庫存sql,由於表的行鎖,併發更新變成序列執行update sql。此時會導致大量的對同一條資料的update語句堆積,資料庫壓力增高。這意味著,大量的事務沒辦法及時提交,進而導致應用會一直占用資料庫連線而不能及時釋放。資料庫鏈結資源是有限的,從而導致了一系列問題。items_spec
setstock = stock - #
where
id = #
andstock >= #
如何解決?把資料庫的壓力轉移到應用層?使用分布式鎖。
考慮加入分布式鎖的併發場景,對同一件商品的扣減庫存時加上分布式鎖,此時,獲得鎖的去執行update sql,未獲得鎖的應用則進入阻塞狀態。此時,資料沒有產生update 語句的堆積,資料庫壓力減小。事務和資料庫鏈結也能得到及時的提交和釋放
分布式鎖的技術選型
一,基於資料庫實現分布式鎖 悲觀鎖 利用select where for update 排他鎖 注意 其他附加功能與實現一基本一致,這裡需要注意的是 where name lock name欄位必須要走索引,否則會鎖表。有些情況下,比如表不大,mysql優化器會不走這個索引,導致鎖表問題。樂觀鎖 所...
C Redis分布式鎖的應用
我們在開發很多業務場景會使用到鎖,例如庫存控制,等。一般我們會使用記憶體鎖的方式來保證線性的執行。但現在大多站點都會使用分布式部署,那多台伺服器間的就必須使用同乙個目標來判斷鎖。分布式與單機情況下最大的不同在於其不是多執行緒而是多程序。分布式站點使用記憶體鎖方式如下圖 假設有3個使用者同時購買一件商...
分布式鎖 常用技術方案
1 是否可以考慮採用reentrantlock來實現,但是實際上去實現的時候是有問題的,reentrantlock的lock和unlock要求必須是在同一執行緒進行,而分布式應用中,lock和unlock是兩次不相關的請求,因此肯定不是同一執行緒,因此導致無法使用reentrantlock。2 基於...