2019独角兽企业重金招聘Python工程师标准>>>

一、问题分析
先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。
然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超买,以防止造成不必要的损失是众多电子商务网站程序员头疼的问题,这同时也是最基本的问题。
从技术方面剖析,很多人肯定会想到事务,但是事务是控制库存超卖的必要条件,但不是充分必要条件。

正常情况下我们会这样写:
//获得商品库存
select counts from goods where id=?
//对比库存和下单时购买商品数量
if(counts<buyAmount){
    //库存不足...
}else{
    //业务代码...更新库存..
}
大多数人都会这么写,看似问题不大,其实隐藏着巨大的漏洞:
数据库的访问其实就是对磁盘文件的访问,数据库中的表其实就是保存在磁盘上的一个个文件,甚至一个文件包含了多张表。例如由于高并发,当前有多个用户进入到了这个事务中,
这个时候会产生一个共享锁,所以在select的时候,这多个用户查到的库存数量都是N个,同时还要注意,mysql innodb查到的结果是有版本控制的,
再其他用户更新没有commit之前(也就是没有产生新版本之前),当前用户查到的结果依然是N;
然后是update,假如这多个用户同时到达update这里,这个时候update更新语句会把并发串行化,也就是给同时到达这里的多个用户排个序,一个一个执行,并生成排他锁,
在当前这个update语句commit之前,其他用户等待执行,commit后,生成新的版本;这样执行完后,库存或许为负数了。

改进版:
把上面的代码稍微改动一下,可以避免这样情况发生
//更新库存
update goods set counts=counts-buyAmount where  id=?
//获取当前商品库存
select counts from goods where id=?
//判断库存是否为负数
if(counts<0){
    //回滚事务
}else{
    //业务代码...更新库存..
}

但是==========================
在高并发的情况下,肯定不能如此高频率的去读写数据库,会严重造成性能问题的
必须使用缓存,将商品放入缓存中,并使用锁来处理其并发情况。当接到用户提交订单的情况下,先将商品数量递减(加锁/解锁)后再进行其他方面的处理,处理失败在将数据递增1(加锁/解锁),
否则表示交易成功。当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。

转载于:https://my.oschina.net/u/3387320/blog/2995941

Java解决高并发下商品库存更新相关推荐

  1. Day783.网络通信优化之I/O模型:如何解决高并发下I/O瓶颈 -Java 性能调优实战

    网络通信优化之I/O模型:如何解决高并发下I/O瓶颈 Hi,我是阿昌,今天学习记录的是关于网络通信优化之I/O模型:如何解决高并发下I/O瓶颈. 提到 Java I/O,相信你一定不陌生. 可能使用 ...

  2. 怎么解决高并发下抢红包和商品超卖问题?

    一.场景模拟 在抢红包或秒杀商品的时候,肯定会有高并发的情况出现,程序中如果出现库存重复减扣的情况,那肯定是不行的!接下来模拟一下高并发下的库存重复减扣问题以及相应的解决方案. 1.  在测试前,需要 ...

  3. Java解决高并发秒杀商品

    在看本文章之前,需要了解Spring boot搭建和使用 ,本篇文章核心问题是如何解决高并发问题. 开发环境:redis缓存4.0.1,Rabbitmq消息队列,Erlang(这个跟MQ环境有关,先安 ...

  4. redis rua解决库存问题_如何解决高并发下的库存安全问题,没你想得那么复杂(附源码)...

    一. 问题 不知道大家该开发中有没有遇到这样的一个问题,在电影院购票或者去网上买东西的时候,比方说当年哪吒大电影出来的时候,那抢票相当火爆啊,一票难求,那购票系统的后台是如何保证观众能买到自己喜欢的票 ...

  5. 使用apache log解决高并发下log4j引起大量线程block问题

    由于项目用户量比较大,测试同事采用两百并发进行测试,在测试查过程中,查看jvm 虚拟机发现很多日志线程出现BLOCKED, 结果如下: "http-saoma%2F192.168.6.162 ...

  6. 解决高并发下Redis连接失败redis.clients.jedis.exceptions.JedisConnectionException Attempting to read from a bro

    引出问题 当前Redis配置项 测压环境 出现的问题: redis.clients.jedis.exceptions.JedisConnectionException: Attempting to r ...

  7. 用java生成高并发下的唯一的案件编号:

    预备知识: 1.AtomicInteger 这个类真的非常实用,更重要的是 它确实非常简单: 附上自己的代码,可以自己试试: AtomicInteger,一个提供原子操作的Integer的类.在Jav ...

  8. 聊聊高并发下库存加减那些事儿——“异步扣减库存”

    聊聊高并发下库存加减那些事儿 不定期福利发放哦 聊聊高并发下库存加减那些事儿 背景 一般在日常开发中经常会遇到打折促销,秒杀活动,就如拼多多最近的4999抢券买爱疯11促销活动,毕竟谁的钱也不是大风刮 ...

  9. Java多线程学习二十七:AtomicInteger 在高并发下性能不好,如何解决?为什么?

    AtomicInteger 在高并发下性能不好,如何解决?以及为什么会出现这种情况? 我们知道在 JDK1.5 中新增了并发情况下使用的 Integer/Long 所对应的原子类 AtomicInte ...

  10. java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?

    近些年科技发展水平越来越快速了,这也促使了大家对于新兴软件的学习.尤其是对于java的渴求更是明显,这也进一步说明了java功能的强大.今天就来为大家介绍一下java高并发下怎么保障数据安全以及有哪些 ...

最新文章

  1. matlab中所遇到的问题,【总结】【matlab】【机器学习】学习过程中遇到的问题总结...
  2. python标准算术操作符有哪些_在python中的算术操作符
  3. 5个常用的Python功能代码
  4. Angular应用只执行指定单元测试的小技巧
  5. ubuntu(jdk配置)
  6. matlab脑电打码,matlab 脑电信号特征提取程序
  7. javaMD5加密生成key方法
  8. 微信H5 跳转小程序 (html版本)
  9. 成都双流计算机大专学校,成都双流有哪些好的职业学校?
  10. PS Photoshop 无法识别数位板 钢笔压力 感叹号
  11. 搭建vue脚手架全教程
  12. JOB DESCRIPTION
  13. 跟着B站UP主小姐姐去华为坂田基地采访扫地僧
  14. GEE开发之NDVI和EVI数据集
  15. Java基础9----运算符2(关系,逻辑运算符)
  16. mybatis类型转换器处理PostGis数据库geometry类型转换
  17. 【饭谈】:开发说他要是不写bug,测试就会失业了。
  18. 智慧城市产业热点板块及产业图谱
  19. CSS,font-family,好看,常用,中文,字体(更新中)
  20. 山东大学为什么火了_“火得一塌糊涂”的山东大学:号称巨无霸、全国排名前三十...

热门文章

  1. SecureCRT软件安装
  2. 今日制造怎么安装solidworks插件_PS插件安装后出现了登陆界面,无法使用怎么解决?保证一招搞定...
  3. SpringBoot-Learning-作者:翟永超
  4. 清理c盘、c盘哪些文件可以删、图形显示文件大小软件
  5. ABB伺服驱动调试(四)
  6. python中求绝对值的函数_python如何取绝对值 python取绝对值方法
  7. 《未来世界的幸存者》读后有感
  8. Linux fstab文件详解
  9. 深度学习C++代码配套教程(1. 总述)
  10. 软件开发者如何提高编程能力?