中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用數據庫的悲觀鎖來實現一個分布式的鎖

發布時間:2022-01-15 10:11:47 來源:億速云 閱讀:224 作者:iii 欄目:云計算

這篇“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”文章吧。

分布式鎖顧名思義是發生在分布式環境中的。對于單進程場景,我們可以使用語言和類庫提供的鎖,對于分布式鎖,我也可以使用分布式鎖。也就是說同樣的鎖使用的環境不同,分布式環境中用的鎖就叫分布式鎖!

根據上面的理解,分布式鎖是不是應該具備下面的特點:

  1. 分布式鎖必須保證在分布式部署的應用集群中,同一個方法在同一時間只能被一臺機器上的一個線程執行;

  2. 一個線程獲得了鎖,其他線程必須等待持有鎖的線程釋放掉才能再獲取;

  3. 鎖必須要有超時機制(避免死鎖)

基于上面的特點,我們就可以通過數據庫的悲觀鎖來實現一個分布式鎖。

代碼非常的簡單,使用 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 悲觀鎖可以用來做分布式鎖,但實際的生產過程中采用這種方法的非常少,因為它性能不是很高。

以上就是關于“怎么用數據庫的悲觀鎖來實現一個分布式的鎖”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平武县| 阳谷县| 锦屏县| 来安县| 自贡市| 高平市| 莱州市| 石台县| 高碑店市| 盘锦市| 阿拉尔市| 定结县| 黄石市| 邛崃市| 泰和县| 盘山县| 江西省| 红桥区| 蓬安县| 泰州市| 南溪县| 阿克苏市| 永康市| 阳朔县| 山东| 大同县| 微博| 张掖市| 邢台市| 赤壁市| 屏东市| 呈贡县| 上林县| 苍梧县| 三门峡市| 昂仁县| 沂源县| 道真| 德昌县| 闵行区| 乌恰县|