Java解决高并发下商品库存更新
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解决高并发下商品库存更新相关推荐
- Day783.网络通信优化之I/O模型:如何解决高并发下I/O瓶颈 -Java 性能调优实战
网络通信优化之I/O模型:如何解决高并发下I/O瓶颈 Hi,我是阿昌,今天学习记录的是关于网络通信优化之I/O模型:如何解决高并发下I/O瓶颈. 提到 Java I/O,相信你一定不陌生. 可能使用 ...
- 怎么解决高并发下抢红包和商品超卖问题?
一.场景模拟 在抢红包或秒杀商品的时候,肯定会有高并发的情况出现,程序中如果出现库存重复减扣的情况,那肯定是不行的!接下来模拟一下高并发下的库存重复减扣问题以及相应的解决方案. 1. 在测试前,需要 ...
- Java解决高并发秒杀商品
在看本文章之前,需要了解Spring boot搭建和使用 ,本篇文章核心问题是如何解决高并发问题. 开发环境:redis缓存4.0.1,Rabbitmq消息队列,Erlang(这个跟MQ环境有关,先安 ...
- redis rua解决库存问题_如何解决高并发下的库存安全问题,没你想得那么复杂(附源码)...
一. 问题 不知道大家该开发中有没有遇到这样的一个问题,在电影院购票或者去网上买东西的时候,比方说当年哪吒大电影出来的时候,那抢票相当火爆啊,一票难求,那购票系统的后台是如何保证观众能买到自己喜欢的票 ...
- 使用apache log解决高并发下log4j引起大量线程block问题
由于项目用户量比较大,测试同事采用两百并发进行测试,在测试查过程中,查看jvm 虚拟机发现很多日志线程出现BLOCKED, 结果如下: "http-saoma%2F192.168.6.162 ...
- 解决高并发下Redis连接失败redis.clients.jedis.exceptions.JedisConnectionException Attempting to read from a bro
引出问题 当前Redis配置项 测压环境 出现的问题: redis.clients.jedis.exceptions.JedisConnectionException: Attempting to r ...
- 用java生成高并发下的唯一的案件编号:
预备知识: 1.AtomicInteger 这个类真的非常实用,更重要的是 它确实非常简单: 附上自己的代码,可以自己试试: AtomicInteger,一个提供原子操作的Integer的类.在Jav ...
- 聊聊高并发下库存加减那些事儿——“异步扣减库存”
聊聊高并发下库存加减那些事儿 不定期福利发放哦 聊聊高并发下库存加减那些事儿 背景 一般在日常开发中经常会遇到打折促销,秒杀活动,就如拼多多最近的4999抢券买爱疯11促销活动,毕竟谁的钱也不是大风刮 ...
- Java多线程学习二十七:AtomicInteger 在高并发下性能不好,如何解决?为什么?
AtomicInteger 在高并发下性能不好,如何解决?以及为什么会出现这种情况? 我们知道在 JDK1.5 中新增了并发情况下使用的 Integer/Long 所对应的原子类 AtomicInte ...
- java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?
近些年科技发展水平越来越快速了,这也促使了大家对于新兴软件的学习.尤其是对于java的渴求更是明显,这也进一步说明了java功能的强大.今天就来为大家介绍一下java高并发下怎么保障数据安全以及有哪些 ...
最新文章
- matlab中所遇到的问题,【总结】【matlab】【机器学习】学习过程中遇到的问题总结...
- python标准算术操作符有哪些_在python中的算术操作符
- 5个常用的Python功能代码
- Angular应用只执行指定单元测试的小技巧
- ubuntu(jdk配置)
- matlab脑电打码,matlab 脑电信号特征提取程序
- javaMD5加密生成key方法
- 微信H5 跳转小程序 (html版本)
- 成都双流计算机大专学校,成都双流有哪些好的职业学校?
- PS Photoshop 无法识别数位板 钢笔压力 感叹号
- 搭建vue脚手架全教程
- JOB DESCRIPTION
- 跟着B站UP主小姐姐去华为坂田基地采访扫地僧
- GEE开发之NDVI和EVI数据集
- Java基础9----运算符2(关系,逻辑运算符)
- mybatis类型转换器处理PostGis数据库geometry类型转换
- 【饭谈】:开发说他要是不写bug,测试就会失业了。
- 智慧城市产业热点板块及产业图谱
- CSS,font-family,好看,常用,中文,字体(更新中)
- 山东大学为什么火了_“火得一塌糊涂”的山东大学:号称巨无霸、全国排名前三十...
热门文章
- SecureCRT软件安装
- 今日制造怎么安装solidworks插件_PS插件安装后出现了登陆界面,无法使用怎么解决?保证一招搞定...
- SpringBoot-Learning-作者:翟永超
- 清理c盘、c盘哪些文件可以删、图形显示文件大小软件
- ABB伺服驱动调试(四)
- python中求绝对值的函数_python如何取绝对值 python取绝对值方法
- 《未来世界的幸存者》读后有感
- Linux fstab文件详解
- 深度学习C++代码配套教程(1. 总述)
- 软件开发者如何提高编程能力?