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、解决方案
只需要保证只有锁的拥有者才可以删除这把锁就好了, 方法有很多
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。