作者回复: 可以分两步来做,先创建订单但是先不生效,然后减库存,如果减库存成功后再生效订单,否则订单不生效
作者回复: 解决的办法就是尽可能避免产生锁,比如根据商品ID进行分库分表设计;再有就是减少锁的粒度例如阿里对MySQL做了定制优化,可以提升MySQL的并发度
作者回复: 前面有个同学的类似的问题回答过,可以看一下
作者回复: 说实话,没看出来哪里性能会更好😄
不过提前下单的思路还比较新颖,你的思路我理解,但是这样就把一个事情分两次来做,会增加了复杂度,有可能导致得不偿失
作者回复: 实际上,商品都是进行分库分表的,例如根据商品id进行水平拆分
分库分表就是提高吞吐量
作者回复: 数据库层不都是串行操作吗😊
作者回复: 秒杀web请求一般不用排队,谁先到谁先执行。
排队一般更多是在服务端的内部请求时发生,而且是在异步请求时通过消息队列来处理
作者回复: 我印象中单实例一般能抗7-8k左右
作者回复: 😉
作者回复: 第三方支付我不知道有没有提供在真正支付之前有没有回调接口,就是在输了支付密码后再调用一次减库存接口,如果这时失败了就判断没有库存了。但是由于支付系统始终不是内部系统,所以不能方便的做事物控制。所以可能是存在极端情况下的超卖。
作者回复: 如果方法一有后续的超时回补库存,那么就差不多了
作者回复: 大家对请求队列这块问的比较多,后面相关的问题我统一回答一下吧
作者回复: 异步下单的方式,也是一个思路,例如在一些场景下其实已经在使用,例如一些支付场景中,付了款以后,前端页面中会有一个转圈,等个几秒钟再告诉你结果。
这种方式我个人觉得对用户不太友好,就是要让用户等个几秒钟,而不是像同步的方式能及时得到反馈结果
作者回复: 库存不足时也就是秒杀结束时了,即使再有一次磁盘操作问题也不大了
看这个语句应该也可以
作者回复: 早期用过😉
作者回复: “按照商品维度设置队列顺序执行”的意思就是,为了防止同一个商品对数据库的操作占用太多的数据库资源,所以采用队列的方式,让其他商品也有公平的机会得到数据的响应,例如如果秒杀的时候,秒杀商品肯定占用大量的请求,数据库的连接池有可能都被秒杀商品占用了,如果不做队列的话,那么其他商品就得不到数据库执行机会了。加入我们分10个队列,那么秒杀商品就会落在这10个队列中的一个,那么最多也就占用机器10分之一的资源。
作者回复: 减库存的幂等是在创建订单时保证的
幂等一般都是保证不会有重复提交发生
作者回复: 预扣是有预定的意思,如果未付款还会补回来
而扣库存就实际的减去库存了
每次预扣都可以创建一条记录,如果这条记录超时了就删掉,剩下的库存就是总库存减去预扣的库存