高并发超库存下单的一个数据库层面解决小技巧

问题描述:
库存更新成负数

产生原因:
由于多线程并发时每个下单线程判断是否超库存时,读到了数据库同样的值,都认为库存满足要求,都执行了下单扣库存的操作,结果就是库存被更新成了负数,实际下单量大于实际库存。

解决办法:
1、可以通过java的sychronized关键字以及Lock API去加锁,这样实现比较重,并且跨jvm的情况需要考虑分布式锁。

2、在数据库压力不是特别大的情况下,可以有一个小技巧来快速解决问题:(TPS很大的情况需要考虑消息队列等方式)

在sql中加上条件,当前库存>=n(要扣除的库存)才执行更新,利用mysql执行更新时的锁表机制,相当于用一条sql将库存读写做成了原子化操作,如果update返回结果<1 ,则说明在执行update瞬间的库存已经不足了

update 商品库存表 set stock=stock-1 where stock is not null and stock >=1 and id = goodsId
int r = updateBySqlString(sql.toString());
if(r<1){
//高并发下超量下单的问题
throw new BusinessException("库存不足,请联系团长");
}

PS. 如果没有索引,update会锁表,如果加了索引,就会锁行

安莫比科技

原文地址:https://www.cnblogs.com/andmobi/p/11824393.html

时间: 2024-08-22 01:44:22

高并发超库存下单的一个数据库层面解决小技巧的相关文章

对于高并发短连接造成Cannot assign requested address解决方法

https://www.cnblogs.com/dadonggg/p/8778318.html 感谢这篇文章给予的启发 在tcp四次挥手断开连接时,主动释放连接的一方最后会进入TIME_WAIT状态,是为了防止最后一次ACK对方没有响应,一般时间为几分钟,这样主动释放连接的一方如果高并发短连接将造成端口资源全部在TIME_WAIT状态而无法分配端口资源,解决方法修改系统配置 修改/etc/sysctl.conf文件,sysctl -p生效 net.ipv4.tcp_syncookies = 1

面试最让你手足无措的一个问题:你的系统如何支撑高并发?

这篇文章,我们聊聊大量同学问我的一个问题,面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压根儿没什么思路去回答,不知道从什么地方说起,其实本质就是没经历过一些真正有高并发系统的锤炼罢了. 因为没有过相关的项目经历,所以就没法从真实的自身体会和经验中提炼出一套回答,然后系统的阐述出来自己复杂过的系统如何支撑高并发的. 所以,这篇文章就从这个角度切入来简单说说这个问题,用一个最简单的思路来回答,大致如何应对. 当然这里首先说清楚一个前提:高并发系统各不

解决数据库高并发访问瓶颈问题

一.缓存式的Web应用程序架构: 在Web层和db层之间加一层cache层,主要目的:减少数据库读取负担,提高数据读取速度.cache存取的媒介是内存,可以考虑采用分布式的cache层,这样更容易破除内存容量的限制,同时增加了灵活性. 二.实现MySQL数据库异步查询实现: 通常情况下在PHP中MySQL查询是串行的,如果能实现MySQL查询的异步化,就能实现多条SQL语句同时执行,这样就能大大地缩短MySQL查询的耗时,提高数据库查询的效率.目前MySQL的异步查询只在MySQLi扩展提供,查

数据库 之 高并发环境下的规则

原文:数据库 之 高并发环境下的规则 本文大部分转至沈剑老师,加上自己的一些见解. 本文前提 高并发环境 规则要点 1) 数据库字符集使用utf8mb4 无乱码风险.万国码 2)禁止使用存储过程.视图.触发器.Event 高并发大数据的互联网业务,架构设计思路是"解放数据库CPU,将计算转移到服务层",并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现"增机器就加性能".数据库擅长存储与索引,CPU计算还是上移吧 3)禁止

解决数据库高并发

解决数据库高并发的常见方案: 1) 缓存式的 Web 应用程序架构: 在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数 据读取速度.cache 存取的媒介是内存,可以考虑采用分布式的 cache 层,这样更容易破除内存容量 的限制,同时增加了灵活性. 2) 增加 Redis 缓存数据库: 把经常访问到的数据而且不需要经常变化的数据放在缓存中. 主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减少数据库的压力. 第一获取数据从数据库中提取

高并发情况利用锁机制处理缓存未命中

关于缓存的使用,个人经验还是比较欠缺,对于缓存在应用系统中的使用也只是前几个月在公司实习的时候,简单的使用过,且使用的都是人家把框架搭建好的,至于缓存在并发情况下会产生的一系列问题都已经被框架处理好了,我所做的只是set和get,至于使用时缓存在并发情况下到底会出现什么样的问题,该如何去解决和避免这些问题,没有去深究. 秉着"学而时习之"的态度(T_T自己太懒,厚着脸皮),这两天在鼓捣redis,至于redis的基本使用还是挺简单的,今天要说的是我在这个过程中看到网上博客一直提的关于缓

面试官绝杀:系统是如何支撑高并发的?

很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压根儿没什么思路去回答,不知道从什么地方说起,其实本质就是没经历过一些真正有高并发系统的锤炼罢了. 因为没有过相关的项目经历,所以就没法从真实的自身体会和经验中提炼出一套回答,然后系统地阐述出来自己复杂过的系统如何支撑高并发的. 所以,这篇文章就从这个角度切入来简单说说这个问题,教你用一个最简单的思路来如何应对的. 当然这里首先说清楚一个前提:高并发系统各不相同.比如每秒百万并发的中间件系统.每日

高并发高访问网站构建

[IT168 专稿]2012年春节,铁道部推出12306网站,进行网络实名购票.每一个返乡人原以为能买着一张回家的火车票,但结果还是大失所望.7天内,12306网站访问用户已占全球互联网用户的0.902%,每天点击量高达10亿人次,系统一度支撑不住如此庞大的访问量而陷入崩溃,针对12306的责难也不绝于耳. 对此,中国铁路客户服务中心透露,目前,铁道部已启动了新一代客票系统的规划和设计.考虑采用云计算架构,对现有的客票系统进行全面的优化和改造.对此,IT168采访了某互联网公司系统管理员林学谦,

手把手让你实现开源企业级web高并发解决方案

本来想起个比较风趣点的标题,可想来思去,还是走常规路线,做一系列的手把手吧. 这样一来,便于我的老朋友们识别,也让我对这篇文章的粒度把我有个定位.   本篇博文主要介绍利用开源的解决方案,来为企业搭建web高并发服务器架构花了一个多小时,画了张图片,希望能先帮你理解整个架构,之后我在一一介绍.linux的大型架构其实是一点点小架构拼接起来的,笔者从各个应用开始配置,最后在完全整合起来,以实现效果. 笔者所使用的环境为RHEL5.4 内核版本2.6.18 实现过程在虚拟机中,所用到的安装包为DVD