/**
* 解决超卖问题
*/
public boolean check(OrderDto dto) {
//获取下单总数
Integer num = dto.getCount();
//获取商品id
String id = dto.getId();
//获取商品余额
Integer allCount = getGoodsCountById(id);
//数量不够直接返回
if (num <= 0) {
return false;
}
String lockKey = "flag_lock";
String lockValue = UUID.randomUUID().toString();
try {
//获取分布式锁
boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue);
//获取失败直接返回
if (!locked) {
return false;
}
//获取成功减少库存
if (allCount >= num) {
//充足直接减
itemClient.decr(dto.getId(), num);
return true;
} else {
//不足返回
return false;
}
} finally {
// 释放锁
if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) {
redisTemplate.delete(lockKey);
}
}
}
分布式锁解决超卖问题
最新推荐文章于 2024-07-18 19:55:19 发布