mysql商品实现多退少补_(转)mysql处理高并发,防止库存超卖

2023-11-15

原文链接:http://blog.csdn.net/caomiao2006/article/details/38568825

今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过;但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识。今天就我的一些理解,整理一下这个问题,并希望以后这样的课程能多点。

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

从技术方面剖析,很多人肯定会想到事务,但是事务是控制库存超卖的必要条件,但不是充分必要条件。

举例:

总库存:4个商品

请求人:a、1个商品 b、2个商品 c、3个商品

程序如下:

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(提交事务)

以上代码就是我们平时控制库存写的代码了,大多数人都会这么写,看似问题不大,其实隐藏着巨大的漏洞。数据库的访问其实就是对磁盘文件的访问,数据库中的表其实就是保存在磁盘上的一个个文件,甚至一个文件包含了多张表。例如由于高并发,当前有三个用户a、b、c三个用户进入到了这个事务中,这个时候会产生一个共享锁,所以在select的时候,这三个用户查到的库存数量都是4个,同时还要注意,mysql innodb查到的结果是有版本控制的,再其他用户更新没有commit之前(也就是没有产生新版本之前),当前用户查到的结果依然是就版本;

然后是update,假如这三个用户同时到达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 andpostID = 12345');

}catch($e Exception){

rollBack(回滚)

}

commit(提交事务)

=====================================================================================

1、在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成性能问题的

必须使用缓存,将需要秒杀的商品放入缓存中,并使用锁来处理其并发情况。当接到用户秒杀提交订单的情况下,先将商品数量递减(加锁/解锁)后再进行其他方面的处理,处理失败在将数据递增1(加锁/解锁),否则表示交易成功。

当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。

2、这个肯定不能直接操作数据库的,会挂的。直接读库写库对数据库压力太大,要用缓存。

把你要卖出的商品比如10个商品放到缓存中;然后在memcache里设置一个计数器来记录请求数,这个请求书你可以以你要秒杀卖出的商品数为基数,比如你想卖出10个商品,只允许100个请求进来。那当计数器达到100的时候,后面进来的就显示秒杀结束,这样可以减轻你的服务器的压力。然后根据这100个请求,先付款的先得后付款的提示商品以秒杀完。

3、首先,多用户并发修改同一条记录时,肯定是后提交的用户将覆盖掉前者提交的结果了。

这个直接可以使用加锁机制去解决,乐观锁或者悲观锁。

乐观锁,就是在数据库设计一个版本号的字段,每次修改都使其+1,这样在提交时比对提交前的版本号就知道是不是并发提交了,但是有个缺点就是只能是应用中控制,如果有跨应用修改同一条数据乐观锁就没办法了,这个时候可以考虑悲观锁。

悲观锁,就是直接在数据库层面将数据锁死,类似于oralce中使用select xxxxx from xxxx where xx=xx for update,这样其他线程将无法提交数据。

除了加锁的方式也可以使用接收锁定的方式,思路是在数据库中设计一个状态标识位,用户在对数据进行修改前,将状态标识位标识为正在编辑的状态,这样其他用户要编辑此条记录时系统将发现有其他用户正在编辑,则拒绝其编辑的请求,类似于你在操作系统中某文件正在执行,然后你要修改该文件时,系统会提醒你该文件不可编辑或删除。

4、不建议在数据库层面加锁,建议通过服务端的内存锁(锁主键)。当某个用户要修改某个id的数据时,把要修改的id存入memcache,若其他用户触发修改此id的数据时,读到memcache有这个id的值时,就阻止那个用户修改。

5、实际应用中,并不是让mysql去直面大并发读写,会借助“外力”,比如缓存、利用主从库实现读写分离、分表、使用队列写入等方法来降低并发读写。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql商品实现多退少补_(转)mysql处理高并发,防止库存超卖 的相关文章

  • C++11 constexpr简单用法

    关键字 constexpr 是C 11中引入的关键字 声明为constexpr类型的变量 编译器会验证该变量的值是否是一个常量表达式 声明为constexpr的变量一定是一个常量 而且必须用常量表达式初始化 constexpr int mf
  • 如何使用GPT-4:一步步指南

    人工智能技术的发展 让自然语言处理成为了一个备受关注的领域 其中 GPT 4是当今最先进的自然语言处理模型之一 本文将详细介绍如何使用GPT 4进行自然语言生成 第一步 了解GPT 4 GPT 4是由OpenAI开发的自然语言处理模型 它采
  • Linux笔记--Shell编程入门

    查看当前环境下使用的shell 可以使用 echo SHELL 运行shell shell脚本是纯文本文件 通常以 sh作为后缀名 方便系统识别文件类型 但不是必需的 脚本文件中的第一行要指明系统使用哪种shell解释该shell文件 如
  • 计算机不显示桌面文件夹,电脑保存文件路径不显示桌面怎么办

    摘要 腾兴网为您分享 电脑保存文件路径不显示桌面怎么办 掌上电力 信达期货 小米手环 天翼购等软件知识 以及晒课网 国寿e门店 鼠标同步器 奇人怪事之谜 江西农村信用社 e视网 三星3200打印机驱动 超级人脉 晒黑的图片 烟花flash
  • kettle案例11-排序记录

    参考 ETL数据整合与处理 任务3 1 排序是对数据中心的无序记录 按照自然或客观规律 根据关键字段大小递增或递减的次序 对记录重新排列的过程 为了得出学生的成绩排名 需要对 2019年11月月考数学成绩 xls 文件 使用 排序记录 组件
  • JavaWeb图表插件的小研究

    背景 最近的一个项目中 对数据的统计分析有很大的要求 这就要求有一款很强大的报表 图表插件 因此 组长给分了任务 让我们各自去研究不同的图表插件 用了一两天的时间 对java这块的图表插件做了一个简单的研究 java方向的图报表还是有很多很
  • 小熊派BearPi-HM nano开发板 -- 前期准备

    课前准备 1 小熊派BearPi HM nano开发板 2 E53农业案例拓展版 3 学习资料 Ubuntu20 04版本 学习视频 学习课件 案例等等 安装教程 Ubuntu20 04安装及配置 开发环境Windows和Ubuntu的配置
  • STM32CubeMX ADC采样的坑

    1 选用了ADC1 IN15 ADC1 IN16 ADC1 IN17 ADC1 IN18会发现有的通道不能用 解决方法 把Sequencer设置为not fully configurable 这样子的弊端是无法再设置采样的先后优先级 但是
  • NBIOT模块连接巴法云实践(SIM7020)

    使用NBIOTSIM7020模块连接巴法云并进行数据通信 一 前期准备 1 巴法云新建主题 这里使用TCP协议 因此创建TCP设备云 2 模块 使用前焊接好模块天线 3 SIM卡 物联专用卡 4 USB UART接口 5 杜邦线4根 6 串
  • Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

    文章目录 一 企业镜像源 1 阿里云 2 网易163 3 搜狐镜像 4 华为 二 高校镜像源 1 清华源 2 北京大学 3 中国科学技术大学源 USTC 4 上海交通大学 5 山东大学 6 吉林大学开源镜像站 7 哈尔滨工业大学开源镜像站
  • 像素鸟 代码 html,2021-04-05像素鸟代码

    html gt Document margin 0 padding 0 game width 800px height 600px background url images sky png position relative overfl
  • umi页面跳转定位问题

    突然发现 在umi页面中 如果没有设置页面定位 那么在页面中部或者底部点击跳转到下一页 会默认跳转到该页面对应的中部或者下部的位置 那么 如果想要在跳转时 直接定位到页面的头部 应该怎么做呢 首先 确定需求 目前项目的需求是 无论从上一页的
  • Access&Trunk&单臂路由

    一 实验要求 要求 1 pc1属于vlan10 配置静态IP地址192 168 1 2 24 2 pC2属于vlan20 配置静态IP地址192 168 2 2 24 3 LSw1交换机上配置PC1和PC2的网关地址 分别为192 168
  • 免费版对象存储【minIO】CentOS部署实践记录 2021

    之前一直用的七牛 不过是收费的 然后有些定制化需求 可能比较看重预算 然后就有了这篇开源方式 minio 一 简介 官方文档 http docs minio org cn docs MinIO 是一个基于Apache License v2
  • react打包成html5,create-react-app项目打包相关问题

    Q1 yarn build打包生成的文件直接点击index html报错 打不开 导致的问题是yarn build打包生成的文件部署到服务器时只能在服务器根目录 如果在其他文件夹里面会报错 A1 默认情况下 index html中引入js和
  • XSS-5注入靶场闯关(小游戏)——第五关

    一 首先先尝试 查看源代码 可以看到 他前面有一个引号 并且
  • 做出刷屏文字的6大哲学

    title 做出刷屏文字的6大哲学 date 2019 09 05 23 39 16 tags 刷屏 文字 哲学 published true hideInList false feature https s2 ax1x com 2019
  • 遥感影像语义分割论文笔记(二)Category Boundary Detection Network

    A semantic segmentation method with category boundary for Land Use and Land Cover LULC mapping of Very High Resolution V
  • 配置 gitlab https 访问

    文章目录 1 备份 2 生成SSL证书 3 配置文件 4 重启 5 访问 1 备份 docker exec ti gitlab ce gitlab rake gitlab backup create 2 生成SSL证书 yum instal

随机推荐

  • 药物 3D 打印新突破:圣地亚哥大学用机器学习筛选喷墨打印生物墨水,准确率高达 97.22%

    内容一览 药物喷墨打印是一种高度灵活和智能化的制药方式 据相关报告统计 该领域市场规模将在不久的未来呈现指数级增长 过往 筛选合适生物墨水的方法费时且费力 因此也成为药物喷墨打印领域面临的主要挑战之一 为解决这一问题 国际药剂学期刊 Int
  • 高斯牛顿法求非线性最小二乘的步骤和c++代码实现

    slam图优化的本质是一个非线性优化问题 Gauss Newton求解步骤 1 线性化误差函数 2 构建线性系统 3 求解线性系统 4 更新解 并不断迭代直至收敛 一个简单的代码实现 一维参数xy 高维变为对应的矩阵即可 include
  • 如何用cublas计算逆矩阵?

    cublas的文档中提供了一个用LU分解求逆矩阵的方法 需要用到两个函数 cublas
  • yum Error downloading packages: xxx [Errno 256] No more mirrors to try.

    问题 解决 yum clean all执行后再执行yum makecache 清除缓存以及重新下载相关包信息缓存到本地
  • C语言之自定义函数的实现

    自定义函数的作用 方便管理代码 编写程序时思路清晰 代码复用 同一段代码可以在不同位置多次执行 函数声明 使用 返回值类型 函数名 类型 变量名 类型 变量名 例如 int sum int num1 int num2 实际上 在函数声明时
  • 【Leetcode】154. 寻找旋转排序数组中的最小值 II

    题目描述 已知一个长度为 n 的数组 预先按照升序排列 经由 1 到 n 次 旋转 后 得到输入数组 例如 原数组 nums 0 1 4 4 5 6 7 在变化后可能得到 若旋转 4 次 则可以得到 4 5 6 7 0 1 4 若旋转 7
  • php脚本中利用mail函数发送邮件及问题归纳

    最近在学php脚本语言 书中有一个实例 服务器端将浏览器发送的信息通过php脚本 利用mail函数发送到一个邮箱 自己讲书中实例代码上传至服务器 在浏览器上填写表单 并提交后 邮箱迟迟收不到邮件 1 php中mail函数发送邮件失败问题 邮
  • 2021-10-19,Oracle VM VirtualBox中安装增强功能失败

    问题 Oracle VM VirtualBox中安装增强功能失败 根据给出的信息提示进行解决 This system is currently not set up to build kernel modules Please instal
  • 静态博客提升访问速度:内嵌CSS,异步加载js,压缩HTML

    在谷歌搜索的功能速度 实验性 中推荐使用工具PageSpeed Insights查看我的网页访问速度情况 PageSpeed Insights 分数很低 只有33分 优化建议的第一条是移除阻塞渲染的资源 里面列出了非异步加载的css和js文
  • 公告

    作为一个稳定 高效 安全的区块链底层平台 FISCO BCOS一方面致力于保障系统稳定性 兼容性 鲁棒性 易用性 另一方面专注于提升区块链底层平台的性能 可扩展性 自FISCO BCOS v3 0开始 社区更是秉着开源 开放 联合共建的原则
  • 最长公共子序列算法_解决最长公共子序列问题的算法和过程

    最长公共子序列算法 最长的公共子序列 Longest common Subsequence Let X and Y be two subsequences and by LCS algorithm we can find a maximum
  • 机器学习笔记——概率生成模型

    假设有两类数据 每一类都有若干个样本 概率生成模型认为每一类数据都服从某一种分布 如高斯分布 从两类训练数据中得到两个高斯分布的密度函数 具体的是获得均值和方差两个参数 测试样本输入到其中一个高斯分布函数 得到的概率值若大于0 5 则说明该
  • nestjs:判断字符串是否是邮箱格式

    问题 如标题 参考 js判断邮箱格式是否正确 掘金 解决 function checkIsMail mail string const regex a zA Z0 9 a zA Z0 9 a zA Z0 9 2 4 return regex
  • c++之全局变量

    全局变量需要我们在头文件声明 在cpp文件定义 请记住尽量这么做 保持操作的规范性 全局变量的使用 一般为两种 一种是不包含头文件 一种是包含了头文件 1 不包含头文件 例如我在test02 h中声明了全局变量 接下来在cpp中定义 如果想
  • 九十六、kettle版本8.2连接数据库的中文乱码问题

    在学习使用kettle 从Excel导数据到MySQL数据库的过程中踩了不少坑 总结一下以做前车之鉴 希望能给大家提供一点帮助 关于中文乱码目前找到了两种也可以叫三种方法 因为版本不同而方法可能不同 目前我使用第一种防范解决了中文乱码问题
  • React:状态提升案例-烧开水

    1 定义Boilingverdict组件 function Boilingverdict props if props celsius gt 100 return h1 水烧开了 h1 else return h1 水凉凉 h1 expor
  • ffmpeg基础一:解封装

    参考 零声学院 1 解封装流程 2 打开文件或媒体 获取文件或媒体的媒体信息AVFormatContext AVFormatContext是描述一个媒体文件或媒体流的构成和基本信息的结构体 AVFormatContext ifmt ctx
  • python绘制动态变化的图_用Jupyter Noteb中的matplotlib绘制动态变化图形

    我一直在寻找一个很好的解决方案 其中一个线程正在泵送数据 我们希望Jupyter笔记本不断更新图形 而不阻止任何事情 在查阅了十几个相关答案后 以下是一些发现 小心 如果你想要一个实时的图表 不要使用下面的魔术 如果笔记本使用以下内容 则图
  • 一个在PDO数据绑定上踩的坑

    不经常用PDO 一直不知道数据绑定的时候的一个细节 不可使用同一个变量名为不同的符号进行数据绑定 因为这样的话会导致在执行execute 时 不同符号都绑定了同一个值 最后一个赋予这个变量名的值 比如 letters array a b c
  • mysql商品实现多退少补_(转)mysql处理高并发,防止库存超卖

    原文链接 http blog csdn net caomiao2006 article details 38568825 今天王总又给我们上了一课 其实mysql处理高并发 防止库存超卖的问题 在去年的时候 王总已经提过 但是很可惜 即使当