一、问题分析

先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。

然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超买,以防止造成不必要的损失是众多电子商务网站程序员头疼的问题,这同时也是最基本的问题。

从技术方面剖析,很多人肯定会想到事务,但是事务是控制库存超卖的必要条件,但不是充分必要条件。

正常情况下我们会这样写:

//获得商品库存

select counts from goods where id=?

//对比库存和下单时购买商品数量

if(counts

//库存不足...

}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时,表示商品秒杀完毕,拒绝其他用户的请求。

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. php电商交押金的逻辑,PHP高并发下抢购、秒杀功能的超卖问题

    ​抢购.秒杀是电商系统比较常见的功能,高并发下一般需要解决两个问题: 高并发下数据库的压力 高并发竞争下出现超卖问题 对于第一个问题,一般可以通过缓存.分库分表.主从等可以解决,这儿主要说说超卖问题. ...

  8. java 高并发商城库存订单处理,下单减库存,如何解决高并发减库存问题

    下单减库存,如何解决高并发减库存问题 1. 减库存 一般下单减库存的流程大概是这样的: 1.查询商品库存.这里直接查的Redis中的库存. 2.Redis中的库存减1.这里用到的Redis命令是:in ...

  9. 高并发下 如何安全、高效扣减库存? 有更好的方案?

    参考文档 干货分享:五分钟教你解决高并发场景下的订单和库存处理方案 聊聊高并发下库存加减那些事儿--"如何实现异步扣减库存" Redis如何实现高并发分布式锁? 如何利用Redis ...

  10. 高并发下防止库存超卖解决方案

    一.概述 目前网上关于防止库存超卖,我没找到可以支持一次购买多件的,都是基于一次只能购买一件做的秒杀方案,但是实际场景中,一般秒杀活动都是支持1-5件的,因此为了补缺,写了此文,方便自己之后使用. 二 ...

最新文章

  1. RPC 笔记(06)— socket 通信(多线程服务器)
  2. Shodan搜索引擎介绍
  3. java 用来查找输出的函数_Solr复杂查询一:函数查询
  4. NOI2013矩阵游戏
  5. Android Settings中显示自定义dialog
  6. Java Float类floatToIntBits()方法与示例
  7. oracle确实表达式,ORACLE正规表达式
  8. Ngnix笔记proxy_set_header设置X-Real-IP(Java获取客户端IP地址)
  9. linux内核启动过程4:内核运行时
  10. 每个人都有属于自己的机会
  11. SQL2005系统升级手记之三-设置维护计划进行数据库备份
  12. 【Python】input()函数用法小结
  13. 适合计算机的音乐,好听的适合做电脑开机音乐的歌
  14. 基于排序变换混沌置乱算法的图像加密系统
  15. 49个excel常用技巧(二)
  16. 局域网与城域网(1)(网工)
  17. calcite learn
  18. criterial查询(2014-05-29 03:51)续-----Example
  19. 你有没有被人不动声色的保护过?
  20. java分页实现(一)

热门文章

  1. 橙色优学:成为“码农”简单吗?学习方式需要划重点
  2. 金蝶K3后台SQL修改数据-科目余额表、科目表核算项目
  3. 微信公众账号开发教程(三) 实例入门:机器人(附源码) ——转自http://www.cnblogs.com/yank/p/3409308.html...
  4. 纯电动汽车整车控制器(VCU)详细介绍
  5. Java蓝桥杯 算法提高 九宫格
  6. GBK,Unicode,UTF-8相互转化 C语言
  7. Java @link 注释
  8. 薄透镜焦距的计算公式
  9. 大橙子主题vfed3.15模板
  10. python解最强大脑: 黑白迭代