關於分布式鎖技術落地到應用的感想

2021-10-04 22:18:13 字數 475 閱讀 3949

應用場景 某一商品的秒殺建立訂單扣減庫存的sql

update

items_spec

setstock = stock - #

where

id = #

andstock >= #

考慮未加分布式鎖併發場景下,資料庫中執行扣減庫存sql,由於表的行鎖,併發更新變成序列執行update sql。此時會導致大量的對同一條資料的update語句堆積,資料庫壓力增高。這意味著,大量的事務沒辦法及時提交,進而導致應用會一直占用資料庫連線而不能及時釋放。資料庫鏈結資源是有限的,從而導致了一系列問題。

如何解決?把資料庫的壓力轉移到應用層?使用分布式鎖。

考慮加入分布式鎖的併發場景,對同一件商品的扣減庫存時加上分布式鎖,此時,獲得鎖的去執行update sql,未獲得鎖的應用則進入阻塞狀態。此時,資料沒有產生update 語句的堆積,資料庫壓力減小。事務和資料庫鏈結也能得到及時的提交和釋放

分布式鎖的技術選型

一,基於資料庫實現分布式鎖 悲觀鎖 利用select where for update 排他鎖 注意 其他附加功能與實現一基本一致,這裡需要注意的是 where name lock name欄位必須要走索引,否則會鎖表。有些情況下,比如表不大,mysql優化器會不走這個索引,導致鎖表問題。樂觀鎖 所...

C Redis分布式鎖的應用

我們在開發很多業務場景會使用到鎖,例如庫存控制,等。一般我們會使用記憶體鎖的方式來保證線性的執行。但現在大多站點都會使用分布式部署,那多台伺服器間的就必須使用同乙個目標來判斷鎖。分布式與單機情況下最大的不同在於其不是多執行緒而是多程序。分布式站點使用記憶體鎖方式如下圖 假設有3個使用者同時購買一件商...

分布式鎖 常用技術方案

1 是否可以考慮採用reentrantlock來實現,但是實際上去實現的時候是有問題的,reentrantlock的lock和unlock要求必須是在同一執行緒進行,而分布式應用中,lock和unlock是兩次不相關的請求,因此肯定不是同一執行緒,因此導致無法使用reentrantlock。2 基於...