由于网络延迟造成逻辑锁过期的问题,lock.tryLo
分享于 点击 32261 次 点评:1
由于网络延迟造成逻辑锁过期的问题,lock.tryLo
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();
}
}
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:租约时间,如果当前线程成功获取到锁,那么锁将被持有的时间长度。这个时间过后,锁会自动释放
用户点评