「java中如何防止超卖」java 超卖

博主:adminadmin 2022-11-27 08:58:05 41

本篇文章给大家谈谈java中如何防止超卖,以及java 超卖对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何解决电商网站超卖现象

超卖问题一直都存在,主要还是细致的工作和系统流程的控制,出现问题在销售、售后两端,也有可能是活动开始了但是货还在路上(到货数量和采购数量不一样或者到货产品数量正确但是运输过程中损耗);1、在销售端可以选择付款减库存,可以最大限度防止超卖情况(这个地方在填写库存的问题上正常都是人工填写,大型企业有可能会做系统直接和自己的ERP系统同步库存,手填的容易出现问题,当然系统同步也不是说一定不出问题,主要还是细致检查)2、售后端主要是产品销售完毕不打算再销售,出现售后换货问题,这个也有可能,但是这个不完全是超卖现象,可以给客户换同样价位产品或者可以退款。 更多问题可以在实际工作中去总结

如何防止超卖

防止超卖唯一的方法就是理性消费,不要按着商家的步骤来买东西,就不会超卖。

如何解决高并发秒杀的超卖问题

由秒杀引发的一个问题

我们假设现在商品只剩下一件了,此时数据库中 num = 1;

但有100个线程同时读取到了这个消息 num = 1 ,所以100个线程都开始减库存了。

但你最终会发觉, 其实只有一个线程减库存成功,其他99个线程全部失败。

为何?

这就是MySQL中的排他锁起了作用。

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存, 如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁 ,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

就是类似于我在执行update操作的时候,这一行是一个事务 (默认加了排他锁 )。 这一行不能被任何其他线程修改和读写

这种方式采用了 版本号 的方式,其实也就是 CAS 的原理。

假设此时version = 100, num = 1; 100个线程进入到了这里,同时他们select出来版本号都是version = 100。

然后直接update的时候,只有其中一个先update了,同时更新了版本号。

那么其他99个在更新的时候,会发觉version并不等于上次select的version,就说明version被其他线程修改过了。那么我就放弃这次update

利用redis的单线程预减库存。比如商品有100件。那么我在redis存储一个k,v。例如

每一个用户线程进来,key值就减1,等减到0的时候,全部拒绝剩下的请求。

那么也就是说只有100个线程会进入到后续操作。所以一定不会出现超卖的现象

可见第二种CAS是失败重试,并无加锁。应该比第一种加锁效率要高很多。 类似于Java中的Synchronize和CAS 。

java中如何防止超卖的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 超卖、java中如何防止超卖的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。