分布式锁

2018-07-02  本文已影响0人  Silvergx

几种实现方式


  1. 基于数据库实现分布式锁
  2. 基于缓存(Redis,memcached,tair)实现分布式锁
  3. 基于Zookeeper实现分布式锁

分布式锁实现要求:

基于数据库实现分布式锁
基于数据库乐观锁(版本号)

即基于版本号,在查询资源信息的时候带出版本号(select阶段),更新的时候版本号加1(update阶段),更新的时候对版本号进行校验,如果与查询时一致,则更新成功;如果不同,则更新失败;
存在的问题:基于版本号的解决方案不支持对多张表的操作

基于数据库悲观锁(排他锁)
  1. sql方式:

public boolean lock(){
connection.setAutoCommit(false)
  while(true){
    try{
      result = select * from methodLock where method_name=xxx for update;
      if(result==null){
        return true;
      }
    }catch(Exception e){
    }
sleep(1000);
}
return false;
}

获得排他锁的线程即获得锁,如果获取失败则一直阻塞。
释放锁:

public void unlock(){
connection.commit();
}

  1. 事务:
    将所有数据库操作放在一个事务里,二段式、三段式提交

转自:分布式锁的几种实现方式
           Java并发编程——锁与可重入锁;
           分布式锁方式(一、基于数据库的分布式锁)

上一篇下一篇

猜你喜欢

热点阅读