您好,登錄后才能下訂單哦!
這篇“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”文章吧。
分布式鎖顧名思義是發生在分布式環境中的。對于單進程場景,我們可以使用語言和類庫提供的鎖,對于分布式鎖,我也可以使用分布式鎖。也就是說同樣的鎖使用的環境不同,分布式環境中用的鎖就叫分布式鎖!
根據上面的理解,分布式鎖是不是應該具備下面的特點:
分布式鎖必須保證在分布式部署的應用集群中,同一個方法在同一時間只能被一臺機器上的一個線程執行;
一個線程獲得了鎖,其他線程必須等待持有鎖的線程釋放掉才能再獲取;
鎖必須要有超時機制(避免死鎖)
基于上面的特點,我們就可以通過數據庫的悲觀鎖來實現一個分布式鎖。
代碼非常的簡單,使用 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 悲觀鎖可以用來做分布式鎖,但實際的生產過程中采用這種方法的非常少,因為它性能不是很高。
以上就是關于“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。