91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

發布時間: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

灵石县| 青川县| 潜山县| 武穴市| 成都市| 南丰县| 略阳县| 团风县| 昌都县| 七台河市| 东乌| 巫溪县| 鄯善县| 崇明县| 石泉县| 深州市| 麻城市| 潜江市| 台江县| 布尔津县| 嫩江县| 福州市| 宁化县| 乾安县| 茌平县| 肇东市| 大名县| 固镇县| 沧州市| 嵩明县| 新宁县| 宁武县| 满城县| 和平县| 明星| 荣昌县| 大埔县| 古交市| 武宣县| 剑川县| 永泰县|