分布式系統核心要求 分布式鎖實現之關係型資料庫

2021-10-04 07:04:51 字數 1482 閱讀 4450

利用關係型資料庫特性:實現排它鎖(insert唯一約束)和樂觀鎖(update version一致性)。

表結構

獲取鎖

insert into method_lock (method_name, desc) values ('methodname', 'methodname');
對method_name做了唯一性約束,這裡如果有多個請求同時提交到資料庫的話,資料庫會保證只有乙個操作可以成功。

表結構

drop table if exists `method_lock`;

create table `method_lock` (

`id` int(11) unsigned not null auto_increment comment '主鍵',

`method_name` varchar(64) not null comment '鎖定的方法名',

`state` tinyint not null comment '1:未分配;2:已分配',

`update_time` timestamp not null default current_timestamp on update current_timestamp,

`version` int not null comment '版本號',

`primary key (`id`),

unique key `uidx_method_name` (`method_name`) using btree

) engine=innodb auto_increment=3 default charset=utf8 comment='鎖定中的方法';

先獲取鎖的資訊

select id, method_name, state,version from method_lock where state=1 and method_name='methodname';
占有鎖

update t_resoure set state=2, version=2, update_time=now() where method_name='methodname' and state=1 and version=2;
如果沒有更新影響到一行資料,則說明這個資源已經被別人佔位了。

缺點:1、這把鎖強依賴資料庫的可用性,資料庫是乙個單點,一旦資料庫掛掉,會導致業務系統不可用。

2、這把鎖沒有失效時間,一旦解鎖操作失敗,就會導致鎖記錄一直在資料庫中,其他執行緒無法再獲得到鎖。

3、這把鎖只能是非阻塞的,因為資料的insert操作,一旦插入失敗就會直接報錯。沒有獲得鎖的執行緒並不會進入排隊佇列,要想再次獲得鎖就要再次觸發獲得鎖操作。

4、這把鎖是非重入的,同乙個執行緒在沒有釋放鎖之前無法再次獲得該鎖。因為資料中資料已經存在了。

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式專題 分布式鎖

在傳統的單體應用架構中,遇到併發安全性問題時我們可以通過同步鎖synchronized,同步 塊,reentrantlock等方式都可以解決,但隨著業務的發展,單體應用架構不能滿足龐大的使用者請求量,於是分布式系統應用而生,在分布式系統中,由於每個系統都執行在不同的伺服器上,有著不同的jvm,所以j...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...