博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高并发下的下单功能设计
阅读量:5337 次
发布时间:2019-06-15

本文共 838 字,大约阅读时间需要 2 分钟。

一、初始方案

商品表设计:热销商品提供给,有初始库存。

 

秒杀订单表设计:功的订单情况:

 

Dao设计:主要就是一个减少库存方法,其他CRUD使用JPA自带的方法:

 

数据初始化以及提供保存订单的操作:

 
 

下面就是controller层的设计:

 

上面是全部的基础准备,下面使用一个单元测试方法,,很多人来购买同一个热门商品的情况。

 
 

访问localhost:8080/simulationCocurrentTakeOrder,就可以测试了

预期情况:因为我们只对秒杀商品(123456)初始化了10件,理想情况当然是库存减少到0,订单表也只有10条记录。

1、实际情况:订单表记录

 

2、商品表记录

 

3、下面分析一下为啥会出现超库存的情况:

因为多个请求访问,仅仅是使用dao查询了一次数据库有没有库存,但是比较恶劣的情况是很多人都查到了有库存,这个时候因为程序处理的延迟,没有及时的减少库存,那就出现了脏读。如何在设计上避免呢?

最笨的方法是对SecKillController的seckill方法做同步,每次只有一个人能下单。但是太影响性能了,下单变成了同步操作。

 

二、改进方案

根据多线程编程的规范,提倡对共享资源加锁,在最有可能出现并发争抢的情况下加同步块的思想。应该同一时刻只有一个线程去减少库存。但是这里给出一个最好的方案,就是利用Oracle,–同一时间只有一个线程能够操作同一行记录,对SecKillGoodsDao进行改造:

 

仅仅是加了一个and,却造成了很大的改变,返回int值代表的是影响的行数,对应到controller做出相应的判断。

 

在看看运行情况

 

订单表:

 

在高并发问题下的秒杀情况,即使存在网络延时,也得到了保障。

扩展阅读

来源:https://blog.csdn.net/u013815546/article/details/53928912

 

 

转载于:https://www.cnblogs.com/javafirst0/p/10714982.html

你可能感兴趣的文章
增加samba用户提示Failed to add entry for user
查看>>
字符串替换 方法讨论
查看>>
Hibernate学习-在线书城后台管理系统的设计
查看>>
CentOS环境安装Docker配置nginx+uwsgi+django
查看>>
HDU 2188.悼念512汶川大地震遇难同胞——选拔志愿者-巴什博奕
查看>>
mybatis源码解析之Configuration加载(五)
查看>>
python--用python操作Git
查看>>
sscanf函数——强大的C语言库函数
查看>>
图像和流媒体 -- 帧率、分辨率、码流的概念和关系(转)
查看>>
数论 青蛙的约会 扩展欧几里得
查看>>
struts2.1笔记05:struts2开发环境的搭建
查看>>
GUI编程笔记(java)11:使用Netbeans工具进行GUI编程
查看>>
函数名可以作为函数的返回值
查看>>
C代码中如何调用C++ C++中如何调用C
查看>>
webx学习
查看>>
eclipse导出可供项目引用的jar
查看>>
(16)JavaScript的流程控制(js的循环)
查看>>
java之equals()和hashCode()方法
查看>>
十进制转换为二进制(一直不会算的)
查看>>
Linux源码编译安装php7.3
查看>>