使用資料庫悲觀鎖實現不可重入的分布式鎖

2021-09-20 08:26:11 字數 1118 閱讀 9911

在同乙個jvm程序中時,可以使用juc提供的一些鎖來解決多個執行緒競爭同乙個共享資源時候的執行緒安全問題,但是當多個不同機器上的不同jvm程序共同競爭同乙個共享資源時候,juc包的鎖就無能無力了,這時候就需要分布式鎖了。常見的有使用zk的最小版本,redis的set函式,資料庫鎖來實現,本節我們談談使用資料庫悲觀鎖機制來實現乙個分布式鎖。

這個比較簡單,先來看**:

public class dbdistributedlock 

public static inte***ce callback

public void lock(callback callback) catch (sqlexception e) finally catch (sqlexception e) }}

}

使用資料庫悲觀鎖實現分布式鎖主要用了資料庫的for update命令,執行改命令後,對應行記錄會被鎖住,其它執行緒會被阻塞主,直到獲取到這行記錄的執行緒提交了事務。這裡需要注意要把自動提交設定為false。

多個執行緒執行 rs = stmt.executequery();時候,只有乙個執行緒會獲取到行鎖,其它執行緒被阻塞掛起,獲取鎖的執行緒執行傳遞的callback 的業務邏輯,執行完畢後 執行commit 提交事務,這意味著當前執行緒釋放了獲取的鎖,這時候被阻塞的執行緒會競爭獲取該鎖。

如何使用:

final dbdistributedlock bdistributedlock = new dbdistributedlock(datasource);

bdistributedlock.lock(new callback() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + "end do somthing");

}

如上**可知使用時候只需要建立的乙個dbdistributedlock物件,然後呼叫其lock方法,並且傳遞乙個callback的實現,實現方法裡具體做業務,這些業務是受分布式鎖保護的,擁有原子性。

使用資料庫悲觀鎖實現不可重入的分布式鎖

在同乙個jvm程序中時,可以使用juc提供的一些鎖來解決多個執行緒競爭同乙個共享資源時候的執行緒安全問題,但是當多個不同機器上的不同jvm程序共同競爭同乙個共享資源時候,juc包的鎖就無能無力了,這時候就需要分布式鎖了。常見的有使用zk的最小版本,redis的set函式,資料庫鎖來實現,本節我們談談...

資料庫 悲觀鎖

悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保...

資料庫悲觀鎖的使用解釋

悲觀鎖介紹 百科 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了...