基於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...