库存出现负数 mysql_MySQL处理高并发,防止库存超卖库存出现负数
mysql处理高并发的方式比较多,以下为比较简单的一种(mysql事物控制)
beginTranse();
try{
$result = $dbca->query('select amount from s_store where postID = 12345');
if(result->amount > 0){
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where postID = 12345');
}
}catch($e Exception){
rollBack('');
}
commit();
// 咋一看此方法貌似没有问题,但如果仔细看会发现这个方法是不可取的
// 比如你购买商品的数量是大于1的此时如果库存只剩下1 执行库存就会出现负数的情况
// 就算是商品库存大于1 当有大量的请求挤进事物时会产生一个共享锁,所以在select的时候查询出来的结果都是满足条件的
// 这个时候update更新语句会把并发串行化,也就是给同时到达这里的update语句排个序,
// 一个一个执行,并生成排他锁,在当前这个update语句commit之前,其他用户等待执行,commit后,生成新的版本;这样执行完后,库存肯定为负数了。
// 所有我们需要一个小小的改动:
beginTranse();
try{
//quantity为请求减掉的库存数量,先减去库存
$dbca->query('update s_store set amount = amount - quantity where postID = 12345');
$result = $dbca->query('select amount from s_store where postID = 12345');
if(result->amount < 0){
throw new Exception('库存不足');
}
}catch($e Exception){
rollBack(回滚)
}
commit(提交事务)
简化后:
beginTranse(开启事务)
try{
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where amount>=quantity and postID = 12345');
}catch($e Exception){
rollBack();
}
commit();
库存出现负数 mysql_MySQL处理高并发,防止库存超卖库存出现负数相关推荐
- 秒杀系统设计4要素:硬抗高并发,拒绝超卖,避免少卖,打击黄牛
双十一又要到了,牛牛有点慌,以前一个人的时候,一分钱都不花,现在有了女票,不仅得剁手,还得帮忙抢各种秒杀商品. 今年,牛牛真的不想再去抢秒杀了,为什么呢? 太难了,成千上万的人就盯着秒杀放出来的那点商 ...
- 使用Redis分布式锁处理并发,解决超卖问题
使用Redis分布式锁处理并发,解决超卖问题 参考文章: (1)使用Redis分布式锁处理并发,解决超卖问题 (2)https://www.cnblogs.com/VitoYi/p/8726070.h ...
- 抢票或商品订单防并发、防超卖
分享一下自己项目开发过程中的设计方案,涉及到订单防并发.防超卖的需求,兼容类似抢票,订单需要锁定商品序号,付款后成交,超时或取消后需要将序号放回可以重新下单的需求. 目录 函数整体思路 代码实现 优化 ...
- Mysql在高并发情况下,防止库存超卖而小于0的解决方案
背景: 本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(<0),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没 ...
- MySql(15)——Mysql在高并发情况下,防止库存超卖而小于0的解决方案
本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(<0),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没有造成特 ...
- Redis高并发场景下秒杀超卖解决
目录 1 什么是秒杀 2 为什么要防止超卖 3 单体架构常规秒杀 3.1 常规减库存代码 3.2 模拟高并发 3.3 超卖现象 3.4 分析原因 4 简单实现悲观乐观锁解决单体架构超卖 4.1 悲观锁 ...
- 高并发场景的几种处理方法
作为后端开发,高并发场景是一个绕不过去的坎,今天就来整理下常见的几种思路(暂时不考虑分布式的情况) 一.并发锁 首先我们要知道高并发下会出现某一个时刻流量猛增,还有就是如果是抢购之类的库存类并发可能会 ...
- 高并发超卖问题简要解决方案
1.传统通过数据库保证不超卖 事务+行锁并不是解决超卖的方案,只是保障数据的统一性.传统通过回滚事务的方式防止某些用户多卖的情况. 采用新建一个防重表+事务的方式防止超卖.同一事务中,采用如 用户ID ...
- php redis高并发秒杀超卖解决测试
<?php $redis = new Redis(); $redis->connect("0.0.0.0","6379"); // @$redis- ...
最新文章
- swift_018(Swift 的结构体)
- 撬开骁龙8一看,满满都是顶会论文
- wince下sources\sources.cmn\Makefile.def的相关作用
- stateflow中终止节点小记
- 【每日一题】7月20日题目精讲—着色方案
- 先来先服务算法的特点
- linux终端常用快捷键
- scala学习-scala中的特殊符号使用
- wrapper在python中_virtualenvwrapper如何在python中安装虚拟环境?
- 大数据分析的价值有哪些
- java滥用接口_接口滥用问题
- C语言学习笔记-1(资料:郝斌老师C语言视频)
- Cesium加载GeoJson数据
- veu中点击商品详情打开新窗口
- UINO优锘:产品实施“八步法”让客户感受DCV实施的专业性
- 三维可视化技术在智慧电厂中的作用
- 2. evaluate-reverse-polish-notation
- Machine Learning笔记——逻辑回归算法
- 赚钱套路分享:降维打击,报团取暖的玩法
- Word教程-给10以上的数字加个圈圈!