分布式鎖 資料庫實現

2021-10-09 22:30:00 字數 1499 閱讀 9250

select 檢索出的資料, for update 加上了一把鎖,其他的人是不能修改這個資料的,也不能在給這個資料加鎖。其他執行緒可以檢索出來,但是我在用 for update 再給這些資料加鎖是加不上的,因為這個鎖呢,已經被前乙個執行緒給鎖住了。其他人是不能給它加鎖的,在加鎖的期間,其他人也不能修改這些資料。因為update 更新資料呢,是要獲取這些資料的鎖的

@transactional(rollbackfor = exception.class)

public string databaselock () throws interruptedexception

log.info("進入鎖");

thread.sleep(6000);

log.info("方法執行完成");

return "方法執行完成";

}

select * from business_lock where  business_code = #  for update
58:16秒      進入方法

58:16秒      進入鎖

58:22秒      方法執行完成

58:17秒      進入方法

58:22秒      進入鎖

58:28秒      方法執行完成

在**中我們讓獲取到鎖的應用休眠6秒 ,8080 和 8088 差不多同一時間進入方法,

但是8080更早一些所有獲得到了鎖,而8088就在資料庫中阻塞,等待獲取鎖。

在16秒 8080獲得鎖等待6秒 22秒釋放鎖,這時  8088才拿到了鎖。說明在多個應用中鎖是有生效的。

為什麼要先關掉呢?你現在檢索出來以後或者for update 加了鎖,加了鎖以後它馬上事務呢就會自動的去提交,事務提交了。鎖就會自動釋放了。其他的會話,還會檢索出這條資料來

基於資料庫實現分布式鎖

多個程序 多個執行緒訪問共同元件資料庫.通過selec.for update訪問同一條資料 for update鎖定資料,其他執行緒只能等待 此時只有乙個操作可以對資料進行修改,而其他人不能夠對該資料進行修改操作,但可以檢視 select from distribute lock where bus...

基於資料庫的分布式鎖實現

一 基於資料庫表 要實現分布式鎖,最簡單的方式可能就是直接建立一張鎖表,然後通過操作該表中的資料來實現了。當我們要鎖住某個方法或資源的時候,我們就在該表中增加一條記錄,想要釋放鎖的時候就刪除這條記錄。建立這樣一張資料庫表 create table methodlock id int 11 not n...

分布式資料庫鎖實現思路

實現思路如下 1.資料庫中設計乙個表有如下字段 鎖的key,鎖的生效時間,鎖的過期時間,鎖的型別,獲取到鎖的機器ip位址 2 然後把鎖的key和鎖的型別 作為乙個索引 型別為unique 唯一的。3 在上鎖的時候就是往其中插入資料的時候,由於有乙個唯一索引所以插入資料只會有乙個成功,即搶到鎖的上鎖的...