1. 程式人生 > 資料庫 >Mysql學習總結(83)——常用的幾種分散式鎖:ZK分散式鎖、Redis分散式鎖、資料庫分散式鎖、基於JDK的分散式鎖方案對比總結

Mysql學習總結(83)——常用的幾種分散式鎖:ZK分散式鎖、Redis分散式鎖、資料庫分散式鎖、基於JDK的分散式鎖方案對比總結

一、基於資料庫實現分散式鎖

1.1、悲觀鎖

利用select … where … for update 排他鎖。注意: 其他附加功能與實現一基本一致,這裡需要注意的是“where name=lock ”,name欄位必須要走索引,否則會鎖表。有些情況下,比如表不大,mysql優化器會不走這個索引,導致鎖表問題。

1.2、樂觀鎖

所謂樂觀鎖與前邊最大區別在於基於CAS思想,是不具有互斥性,不會產生鎖等待而消耗資源,操作過程中認為不存在併發衝突,只有update version失敗後才能覺察到。我們的搶購、秒殺就是用了這種實現以防止超賣。通過增加遞增的版本號欄位實現樂觀鎖。

二、基於jdk的實現方式

思路:另啟一個服務,利用jdk併發工具來控制唯一資源,如在服務中維護一個concurrentHashMap,其他服務對某個key請求鎖時,通過該服務暴露的埠,以網路通訊的方式傳送訊息,服務端解析這個訊息,將concurrentHashMap中的key對應值設為true,分散式鎖請求成功,可以採用基於netty通訊呼叫,當然你想用java的bio、nio或者整合dubbo、spring cloud feign來實現通訊也沒問題
缺點:這