给你一个小例子
@Override
public JsonData addCoupon(long couponId, CouponCategoryEnum category) {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
String lockKey = "lock:coupon:"+couponId;
RLock rLock = redissonClient.getLock(lockKey);
//多个线程进入,会阻塞等待释放锁
rLock.lock();
log.info("领劵接口加锁成功:{}",Thread.currentThread().getId());
try{
CouponDO couponDO = couponMapper.selectOne(new QueryWrapper<CouponDO>()
.eq("id", couponId)
.eq("category", category.name()));
//优惠券是否可以领取
this.checkCoupon(couponDO, loginUser.getId());
//构建领劵记录
CouponRecordDO couponRecordDO = new CouponRecordDO();
BeanUtils.copyProperties(couponDO, couponRecordDO);
couponRecordDO.setCreateTime(new Date());
couponRecordDO.setUseState(CouponStateEnum.NEW.name());
couponRecordDO.setUserId(loginUser.getId());
couponRecordDO.setUserName(loginUser.getName());
couponRecordDO.setCouponId(couponId);
couponRecordDO.setId(null);
//扣减库存
int rows = couponMapper.reduceStock(couponId);
if (rows == 1) {
//库存扣减成功才保存记录
couponRecordMapper.insert(couponRecordDO);
} else {
log.warn("发放优惠券失败:{},用户:{}", couponDO, loginUser);
throw new BizException(BizCodeEnum.COUPON_NO_STOCK);
}
} finally {
rLock.unlock();
log.info("解锁成功");
}
return JsonData.buildSuccess();
}

简洁得离谱!
本文作者为DBC,转载请注明。