01
19
27
54
如果允许一次秒杀多个商品,该如何处理?
1.8k
等4人参与

整个流程都需要做改动。

前端页面:
用户在点击秒杀按钮的时候需要传递:user_id 、goods_id 、amout(新增本次要购买的数量)

预减的逻辑:
(1)初始化redis中的数量 == 库存数量
(2)收到请求,不管用户在前端传递想购买多少,redis统一减1
(3)redis减到0就直接返回结束
(4)redis没有减到0,则进入消息队列

消息队列出队下单的逻辑:
//开启事务

transaction.start();
try{	
	//先查库存,加锁
	select stock from goods  where goods_id= #{goodsId} for update
	if(stock < amout){
		return "库存不足";
	}
	//查询用户已经买到的商品的数量
	int sumGoodsCount = select sum(goodsCount) from miaosha_order where user_id = #{userId} and goods_id = #{goodsId} ;
	if(sumGoodsCount >= 2){
		return "超过最大数";
	}
	//用户还能购买的数量
	int availbaleCount = Math.min(2-sumGoodsCount,  amount);
	//修改商品表的库存
	update goods set stock = stock - availbaleCount;
	//生成订单
	insert into miaosha_order(user_id, goods_id, availbaleCount);
	//事务提交
	transaction.commit();
}catch(Exception e){
	//事务回滚
	transaction.rollback();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
代码块
复制 预览
复制成功!
代码块
复制 预览
复制成功!

表结构改造:
(1)miaosha_order中要冗余一下order中购买的商品数量。
(2)miaosha_order中的唯一索引 (user_id, goods_id) 去掉,换成普通索引,因为此时允许用户对同一个商品下多个订单了。

这里我们手动使用了悲观锁,虽然功能可以实现,但是会大大降低数据库的并发度。

我的作业
去发布

登录后即可发布作业,立即

全部作业

1、JSX是把 javascript 中支持写DOM结构的数据
SFC template、script、style各种样式 比起之前的vue2的SFC vue3的SFC不需要functional:boolean属性去表示一个纯函数的SFC

2、JSX和SFC通过转换 最后都会被编译成 VNode 虚拟DOM
3、SFC 能实现的 JSX都可以实现
4、我写 React 所以JSX更友善一些对我
5、没有什么太大的区别、一些语法糖的支持不同

0
评论
提交于  2024-10-28 11:58:03

登录后即可查看更多作业,立即

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号