一、代码
public void consume(MemberValueTaskItemVO valueItem) {
RLock redissonLock = redissonClient.getLock(valueItem.getMemberId() + "");
try {
redissonLock.lock(6, TimeUnit.SECONDS);
//处理消费逻辑
doConsume(valueItem);
} catch (Exception e) {
log.error(e.getMessage());
throw new AcException(e.getMessage());
} finally {
// 释放锁
if (redissonLock.isLocked() && redissonLock.isHeldByCurrentThread()) {
redissonLock.unlock();
}
}
}
二、注意事项
加锁代码不要写在@Transactional
事务里面,否则锁会失效,锁不住数据,还是会出现并发问题。可参考Redisson失效场景
网友评论