1、关于分布式锁的使用

1、非锁的拥有者去删除分布式锁, 依然产生并发问题

a、出问题的伪代码

// 以下是一段伪代码
try {
            boolean lockAcquired = redisTool.tryLockWithBlocking(lockKey, 10, 5000);
            if (!lockAcquired) {
                log.error("获取锁失败: {}",teamCode);
                throw new RuntimeException("获取锁失败")
            }
            // 执行业务逻辑

} catch (Exception e) {
            log.error(e.getMessage);
            throw e;
} finally {
            // 最后删除锁
            redisTool.unlock(lockKey);
}

b、使用场景说明
需求是, 团队有一个公用网盘, 网盘的空间额度是有上限的(这里假定有2G). 每次团队成员上传文件的时候, 需要校验上传的文件是否超过了可用的空间额度, 验证通过后保存文件, 更新存储空间, 保存对应的文件上传记录. 为了解决, 为了解决可用的空间额度的并发问题, 同事采用了redis的分布式锁, 保证一个团队中只有一个团队成员进行上传动作

c、原因分析
出问题的并发场景:

用户A

step1、点击上传 
step2、尝试获取redis锁
step3、执行业务逻辑
step4、finally释放锁

用户B

step1、点击上传 
step2、尝试获取redis锁, 这里我们假定用户A还在执行step3, 此时获取锁失败, 抛出异常
step3、执行finally删除锁, 由于团队共用的是同一把锁, 其实用户A持有的锁也被删除掉

问题用户C

step1、点击上传 
step2、尝试获取redis锁, 因为用户B已经把锁删除掉了, 所以获取锁成功, 但是用户A还没执行完, 所以此时出现了超出团队文件共享的上限

d、解决方案

只需要保证只有锁的拥有者才可以删除这把锁就好了, 方法有很多


maweibinguo
783 声望36 粉丝

后端开发工程师一枚, keep moving