分布式锁在未完成逻辑前过期怎么办?

Sherwin.Wei Lv7

分布式锁在未完成逻辑前过期怎么办?

回答重点

若锁在未完成逻辑前就过期,此时可能会产生数据不一致的问题。因为锁过期了,此时如果再出现一个客户端争抢锁,即可拿到锁然后同时进行业务操作,这等于锁失效了。

Snipaste_2024-05-19_06-39-26.jpg

此时可以在逻辑执行过程中定期续期锁,确保锁在处理过程中不会过期。

扩展知识

看门狗机制

业界出了一个看门狗机制来防止这种情况的产生。

理论很简单,在抢到锁之后,后台会有一个任务,定时向 redis 进行锁的续期。比如锁的过期时间是 30s,可以每过三分之一时长(30/3)10s 后就去 redis 重新设置过期时间为 30s。

在锁被释放的时候,就移除这个定时任务。

Snipaste_2024-05-19_06-52-47.jpg

redission

redission 是一个类库,封装了很多 redis 操作,便于我们使用。

其实现的分布式锁就引入了看门狗机制,具体原理和上面所述的一致,基于 Netty 的时间轮实现的定时任务,关于时间轮的面试题解析可查看《时间轮 》。

并且 redisson 支持可重入锁,即同一个线程可以多次获取同一个分布式锁,而不会导致死锁。实现方法如下:

  • 在获取锁时,检查当前锁的唯一标识是否已经属于当前线程。
  • 如果是,则增加一个重入计数器。
  • 释放锁时,减少重入计数器,只有当计数器为 0 时才真正释放锁。
Comments
On this page
分布式锁在未完成逻辑前过期怎么办?