共計 2093 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”文章的知識點大部分人都不太理解,所以丸趣 TV 小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”文章吧。
分布式鎖顧名思義是發生在分布式環境中的。對于單進程場景,我們可以使用語言和類庫提供的鎖,對于分布式鎖,我也可以使用分布式鎖。也就是說同樣的鎖使用的環境不同,分布式環境中用的鎖就叫分布式鎖!
根據上面的理解,分布式鎖是不是應該具備下面的特點:
分布式鎖必須保證在分布式部署的應用集群中,同一個方法在同一時間只能被一臺機器上的一個線程執行;
一個線程獲得了鎖,其他線程必須等待持有鎖的線程釋放掉才能再獲取;
鎖必須要有超時機制(避免死鎖)
基于上面的特點,我們就可以通過數據庫的悲觀鎖來實現一個分布式鎖。
代碼非常的簡單,使用 for update 即可。具體如下:
public class XttblogLock {
private DataSource dataSource;
private static final String cmd = select * from xttblog_lock where id = 1 for update
public XttblogLock(DataSource ds) {
this.dataSource = ds;
}
public static interface CallBack{
public void doAction();
}
public void lock(CallBack callBack) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//try get lock
System.out.println(Thread.currentThread().getName() + begin try lock
conn = dataSource.getConnection();
conn.setAutoCommit(false);
stmt = conn.prepareStatement(cmd);
rs = stmt.executeQuery();
//do business thing
callBack.doAction();
//release lock
conn.commit();
System.out.println(Thread.currentThread().getName() + release lock
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
該鎖的調用也非常的簡單,具體代碼如下:使用數據庫悲觀鎖實現分布式鎖主要用了數據庫的 for update 命令,執行改命令后,對應行記錄會被鎖住,其它線程會被阻塞主,直到獲取到這行記錄的線程提交了事務。這里需要注意要把自動提交設置為 false。
該鎖的調用也非常的簡單,具體代碼如下:
final XttblogLock xttblogLock = new XttblogLock(dataSource);
xttblogLock.lock(new CallBack() {
@Override
public void doAction() {
System.out.println(Thread.currentThread().getName() + beging do somthing
try {
System.out.println(業余草:www.xttblog.com 歡迎你!
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + end do somthing
}
});
雖然數據庫的 for update 悲觀鎖可以用來做分布式鎖,但實際的生產過程中采用這種方法的非常少,因為它性能不是很高。
以上就是關于“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”這篇文章的內容,相信大家都有了一定的了解,希望丸趣 TV 小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注丸趣 TV 行業資訊頻道。