【面试题】商品超买超卖问题分析及实战 您所在的位置:网站首页 kdj超买超卖自定义指标 【面试题】商品超买超卖问题分析及实战

【面试题】商品超买超卖问题分析及实战

2024-06-26 21:02| 来源: 网络整理| 查看: 265

文章目录 项目场景: 原因分析: 原因说明: 解决方案: 代码实战: 1、synchronized方式 2、redis分布式锁 3、悲观锁 4、乐观锁 5、where条件 6、unsigned 非负字段限制 为什么不通过事务隔离级别控制事务代码的并发 总结:

项目场景:

原文链接

商品超买超卖是高并发下非常典型的问题,也是面试中秒杀场景常常会问到的问题。 常见的问题有: 1、怎么设计一个秒杀系统? 2、商品超买、超卖问题产生的原因? 3、怎么防止商品出现超买|超卖问题? 4、乐观锁和悲观锁的适用场景是什么? 5、提高事务的隔离级别能解决超买|超卖问题吗?

今天和大家一起探究下商品超买、超卖的原因及其解决方案。

原因分析:

商品下单扣减库存的流程如下: 1、根据商品ID查询商品库存信息 2、判断商品库存是否大于购买数量 3、库存充足则进行下单减库存操作

模拟代码如下:

@Transactional(rollbackFor = Exception.class) public void secKill(Integer goodsId, Integer num) throws InterruptedException { //1、查询商品库存 GoodsStock goodsStock = goodsStockMapper.getStock(goodsId); //2、判断库存是否充足 if(goodsStock.getNum() >= num){ //3、使用减法计算出剩余库存 int stockNum = goodsStock.getNum() - num; goodsStock.setNum(stockNum); //4、更新商品剩余库存的值 int result = goodsStockMapper.updateByPrimaryKeySelective(goodsStock); if(result=0 ;

代码实战:

1、商品库存表

CREATE TABLE `goods_stock` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `goods_id` varchar(255) DEFAULT NULL COMMENT '商品id', `num` int(11) DEFAULT NULL COMMENT '库存数量', `version` int(11) unsigned DEFAULT NULL COMMENT '版本号', PRIMARY KEY (`id`), UNIQUE KEY `ui_goods_id` (`goods_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; INSERT INTO `seckill`.`goods_stock`(`id`, `goods_id`, `num`, `version`) VALUES (1, '1', 10000, NULL);

2、控制层代码 SecKillController

@RestController @Slf4j public class SecKillController { @Autowired private SecKillService secKillService; @GetMapping(value = "/secKill/{goodsId}/{num}") public void secKill(@PathVariable Integer goodsId, @PathVariable Integer num) throws InterruptedException{ secKillService.secKil


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有