由于网络延迟造成逻辑锁过期的问题

getLock {
..
网络波动,导致getLock获取的锁已过期失效,其他线程请求仍然可以执行这段逻辑
...
}

解决方案

redisson watch-dog

RLock lock = redissonClient.getLock(code + "SNAPSHOT");
try {
    lock.lock();
    // 业务逻辑
} catch (Exception e) {
    log.error("获取锁失败");
} finally {
    // 释放当前线程获取到的锁
    if (lock != null && lock.isHeldByCurrentThread()) {
        lock.unlock();
    }
}

lock.lock(): 默认自动续租,锁的过期时间默认是30s,如果当前线程没有主动释放,并且锁即将过期则锁会续期。
lock.tryLock(waitTime, leaseTime, timeUnit): 不续租获取锁方法
waitTime:等待获取锁的最长时间
leaseTime:租约时间,如果当前线程成功获取到锁,那么锁将被持有的时间长度。这个时间过后,锁会自动释放

posted @ 2024-11-12 18:01  ethanx3  阅读(98)  评论(0)    收藏  举报