基於資料庫悲觀鎖的分布式鎖

2021-10-19 10:50:14 字數 733 閱讀 5654

基於synchronized和reentrantlock鎖都只限於在單體架構中使用,當出現分布式跨jvm的情況,需要使用分布式鎖來解決跨jvm的問題。

通過select …for update 訪問同一條資料

for update 鎖定資料,其他執行緒只能等待

1.select @@autocommit;查詢若是1,則需要設定為0,否則會話會自動提交事務,將兩個事務autocommit都設定為0。

2.在第乙個會話進行查詢,再第二會話進行查詢,發現無法查詢出資料,這是由於第乙個會話還未commit。

當第乙個會話進行commit後,第二個會話才可以查詢出資料。

注:當不加for update去查詢,是可以查詢資料的。因為加鎖只是鎖定這條資料,因此不能修改這條資料,也不能再給這條資料加鎖。檢索是不影響的。

所以使用該特性實現分布式鎖。

開啟兩個服務,進行測試

基於資料庫的分布式鎖

使用場景 某大型 部署是分布式的,訂單系統有三颱伺服器響應使用者請求,生成訂單後統一存放到order info表 order info表要求訂單id order id 必須是唯一的,那麼三颱伺服器怎麼協同工作來確認order id的唯一性呢?這時候就要用到分布式鎖了。分布式鎖的要求 在了解了使用場景...

基於資料庫實現分布式鎖

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

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

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