用mySql資料庫實現分布式鎖思路

2021-08-17 01:29:32 字數 807 閱讀 3608

在mysql中建乙個表,這個表主鍵唯一。

乙個系統去處理業務時就往資料庫表中新增資料。兩個系統的業務id是一致的,業務id又是唯一主鍵,所以當乙個系統新增資料時,另乙個系統是無法往表中新增資料的。插入資料成功的系統就可以操作業務邏輯,插入失敗的系統就不能操作執行業務邏輯了。這就實現了資料庫鎖。

這就是用mysql實現分布式鎖的乙個大體邏輯,當然了還會由很多問題,但主要流程就是這樣的,一步步來嘍。

按上面這種方式實現分布式鎖,會存在的問題及解決方案如下:

1. 插入資料成功的系統宕機了,這條資料就無法刪除了,就是死鎖了。

解決:可以有乙個定時跑批的方案,當然了,這個資料插入的時間就要有記錄。比如設定2分鐘跑批,把加鎖超過一分鐘的資料刪除。就解決了死鎖的問題。

2. 這個鎖是不可重入的,也就是說這個系統只能加一次鎖,同乙個系統再次進行加鎖時也是不行的。

3. 由問題二引發的新問題,只要系統一次unlock,鎖就釋放了,後面的流程就在沒鎖的情況下完成,這樣其他系統就會也過來加鎖了。

解決:加乙個字段用來記錄加鎖的次數,每次加鎖(重入)加一,每次解鎖就減一,釋放鎖時就是該字段為0才可以。

4. 資料庫宕機怎麼辦?

解決:運用資料庫同步複製來解決,也就是由兩個資料庫來維護資料。正常情況下,生產環境中的系統不允許單節點。

只要的邏輯就是這樣,根據這個思路就可以實現乙個由mysql資料庫來實現的分布式鎖。後續我會自己實現一下,到時候再貼出完成**。

分布式鎖 資料庫實現

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

基於資料庫實現分布式鎖

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

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

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