在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

怎么用数据库的悲观锁来实现一个分布式的锁

193次阅读
没有评论

共计 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字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 97无码免费人妻超级碰碰碰碰 | 成人看免费一级毛片 | 久久精品夜色国产 | 日本高清va不卡视频在线观看 | 欧美在线观看成人高清视频 | 人妻少妇久久中文字幕 | 国产在线不卡一区二区三区 | 苍井空毛片精品久久久 | 青青草精品视频 | 国产老熟女网站 | 亚洲综合欧美日本另类激情 | 色综合99久久久无码国产精品 | 99国产精品永久免费视频 | 国产成人无码aa精品一区 | 久久人人爽av亚洲精品天堂 | 未满十八18禁止免费无码网站 | 91精品91| 久久99精品久久久久久牛牛影视 | 婷婷色婷婷开心五月四房播播 | 亚洲日韩va无码中文字幕 | 日韩在线播放中文字幕 | 日本激情视频网站w | 操操操网| 欧美日韩亚洲国产一区二区三区 | 日本一级毛片中文字幕 | 亚洲综合色一区二区三区小说 | 国产又黄又猛又粗又爽的a片动漫 | 欧美色图偷窥自拍 | 国产成人8x视频网站入口 | 亚洲香蕉久久综合网 | 国产精品久久久久影视不卡 | 久久久久久久久综合影视网 | 日韩精品a片一区二区三区妖精 | 国产精品小视频在线观看 | 成人国产午夜在线视频 | 精品国产第一国产综合精品 | 日日噜噜噜夜夜爽爽狠狠视频 | 人妻aⅴ无码一区二区三区 人妻aⅴ中文字幕 | 国产精品熟妇一区二区三区四区 | 中文第一页 | 久久婷婷综合色丁香五月 |