文档章节

Java解决高并发下商品库存更新

嘴角轻扬30
 嘴角轻扬30
发布于 01/02 13:33
字数 861
阅读 150
收藏 5

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

正常情况下我们会这样写:
//获得商品库存
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时,表示商品秒杀完毕,拒绝其他用户的请求。

© 著作权归作者所有

嘴角轻扬30
粉丝 9
博文 112
码字总数 74702
作品 0
苏州
程序员
私信 提问
如何理解和处理并发下的这些问题,你知道吗?

简介:这几天看并发,看的越来越糊涂,并发中最容易出问题的就是锁。 语言:JAVA 问题描述: 一、 在java 里,程序并发时,加锁,在文档,博客,书籍中,凡是说到并发,都会说一个东西,锁。j...

god_share
2015/03/13
772
3
java web开发中抢购商品这类应用场景的库存准确性和应用的高并发性

java web开发中抢购某个商品这类应用场景中保证商品库存的准确性和整个应用的高并发性怎么实现呀,以前没做过这类应用, 大家给个思路,谢谢!

java雇佣兵
2014/10/11
1K
1
Java编程详细解析—淘宝大秒杀系统是如何设计的?

摘要 最初的秒杀系统的原型是淘宝详情上的定时上架功能,由于有些卖家为了吸引眼球,把价格压得很低。但这给的详情系统带来了很大压力,为了将这种突发流量隔离,才设计了秒杀系统,文章主要...

小刀爱编程
2018/10/08
4.5K
7
阿里P8架构师谈:实战讲解高并发和秒杀抢购系统设计

互联网特别是电商平台,阿里双11秒杀、还有12306春运抢票、以及平时各种节假日抢购活动等,都是典型的高并发场景。这类场景最大的特征就是活动周期短,瞬间流量大(高并发),大量的人短期涌...

mikechen优知
03/04
291
1
面试必看!2018年4月份阿里最新的java程序员面试题目

目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java IO流的层次结构...

美的让人心动
2018/04/16
276
5

没有更多内容

加载失败,请刷新页面

加载更多

基于CentOS7搭建GitLab

基于CentOS7搭建GitLab 12018.11.02 16:38:51字数 959阅读 3791 本文作者:蓝雄威,叩丁狼高级讲师。原创文章,转载请注明出处。 一、简介 Git Lab GitLab是利用 Ruby on Rails 一个开源的版...

linjin200
6分钟前
2
0
random生成随机数

随机生成0到100之间的10个随机数,然后使用冒泡排序将这10个数按从小到大的顺序排序 生成10个随机数 import randomnum = range(0, 100) # 范围在0到100之间,需要用到range()函数。nums...

彩色泡泡糖
9分钟前
1
0
kubernetes 环境搭建 —— kubeadm

主从节点需要安装的服务 Master 节点 Node 节点 etcd-master Control plane(如:calico,fannel) kube-apiserver kube-proxy kube-controller-manager other apps kube-dns Control plane(如:......

lemos
12分钟前
1
0
php将字符串中的中英文数字分割

$str = "php如何将字 符串中322的字母数字Asf f45d和中文_分割?"; $arr = preg_split("/([a-zA-Z0-9]+)/", $str, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); print_r($arr); Arr......

小小小壮
13分钟前
1
0
茑屋书店理解(一)

说到实体书店,你可能会想到两个字“难做”。一是电子书大为盛行,二是纸书作为标准品,完全可以在网上购买,因此国内许多实体书店的日子是举步维艰。但是在日本有这么一家实体书店,目前已经...

Idea
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部