给你一个小例子
@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,转载请注明。