久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

227次閱讀
沒有評論

共計 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 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-03發表,共計2093字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 通道| 怀宁县| 柯坪县| 永胜县| 雷波县| 武乡县| 边坝县| 甘肃省| 孝感市| 郁南县| 荆门市| 十堰市| 上虞市| 乌拉特前旗| 乳源| 启东市| 定边县| 平湖市| 大冶市| 弥渡县| 司法| 安顺市| 尚义县| 隆尧县| 山东省| 那坡县| 城口县| 桓仁| 黄骅市| 大埔区| 红桥区| 青海省| 塔城市| 凤翔县| 大厂| 迭部县| 高密市| 武平县| 湾仔区| 丹棱县| 青冈县|