返回顶部
首页 > 资讯 > 数据库 >mysql处理高并发,防止库存超卖
  • 564
分享到

mysql处理高并发,防止库存超卖

mysql处理高并发,防止库存超卖 2022-03-08 22:03:28 564人浏览 绘本
摘要

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

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 and postID = 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去直面大并发读写,会借助“外力”,比如缓存、利用主从库实现读写分离、分表、使用队列写入等方法来降低并发读写。

 

您可能感兴趣的文档:

--结束END--

本文标题: mysql处理高并发,防止库存超卖

本文链接: https://lsjlt.com/news/6328.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql处理高并发,防止库存超卖
    一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超买,以防止造成不必要的损失是众多电子商务网站程序...
    99+
    2022-03-08
    mysql处理高并发,防止库存超卖
  • PHP高并发情况下防止商品库存超卖
    商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接...
    99+
    2022-06-10
    php 并发
  • 如何解决Redis高并发防止秒杀超卖的问题
    这篇文章主要介绍了如何解决Redis高并发防止秒杀超卖的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1:解决思路将活动写入 redis 中,通过 redis 自减指令扣...
    99+
    2023-06-25
  • Redis高并发防止秒杀超卖实战源码解决方案
    目录1:解决思路2:添加 redis 常量3:添加 redis 配置类4:修改业务层1:秒杀业务逻辑层2:添加需要抢购的代金券3:抢购代金券5:postman 测试6:压力测试8:配...
    99+
    2024-04-02
  • PHP高并发之怎么解决商品库存超卖问题
    这篇文章主要介绍“PHP高并发之怎么解决商品库存超卖问题”,在日常操作中,相信很多人在PHP高并发之怎么解决商品库存超卖问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP高并发之怎么解决商品库存超卖问题...
    99+
    2023-06-29
  • Redis实现库存扣减的解决方案防止商品超卖
    目录Redis 如何实现库存扣减操作?如何防止商品被超卖?解决方案1. 使用mysql数据库2. 还是使用数据库3. 将库存放到redis使用redis的incrby特性来扣减库存。...
    99+
    2024-04-02
  • PHP商品库存超卖并发测试实例分析
    这篇文章主要介绍“PHP商品库存超卖并发测试实例分析”,在日常操作中,相信很多人在PHP商品库存超卖并发测试实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP商品库存超卖并发测试实例分析”的疑惑有所...
    99+
    2023-06-29
  • mysql处理高并发的方法
    小编给大家分享一下mysql处理高并发的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql高并发的解决方法有:优化SQL语句,优化数据库字段,加缓存,分区表,读写分离以及垂直拆分,解...
    99+
    2024-04-02
  • 如何处理MySQL数据库的并发访问?
    如何处理MySQL数据库的并发访问?随着互联网的迅猛发展,我们生活中的各种服务和应用都变得越来越依赖数据库。而数据库的并发访问是一种常见场景,特别是在高并发访问的情况下,对数据库进行合理的并发控制是非常重要的。本文将介绍一些处理MySQL数...
    99+
    2023-10-22
    事务处理 并发控制 数据库锁
  • Django 和 Java:谁更适合处理高并发存储请求?
    Django 和 Java 都是非常流行的 Web 开发框架,但是在处理高并发存储请求方面,哪一个更适合?让我们来比较一下 Django 和 Java 的优缺点。 Django 是一个基于 Python 的 Web 开发框架,它的主要特点...
    99+
    2023-10-16
    索引 django 存储
  • 基于C#解决库存扣减及订单创建时防止并发死锁的问题
    目录解决库存扣减及订单创建时防止并发死锁的问题那么怎样解决死锁?1. 减少事务的执行时间。2. 业务锁测试场景通过查询库存和订单信息核对库存是否扣减正常核验结果解决库存扣减及订单创建...
    99+
    2024-04-02
  • 如何使用PHP开发缓存提高网站的并发处理能力
    如何使用PHP开发缓存提高网站的并发处理能力 随着互联网的高速发展,网站的并发处理能力变得越来越重要。而提高网站并发处理能力的一种常见手段就是使用缓存。缓存可以大大减轻数据库的负担,提高网站的性能和响应速度。PHP作为一种流行的服务器端编程...
    99+
    2023-11-07
    网站开发 并发处理 PHP 缓存
  • 更新库存时,你是如何用mysql锁解决高并发问题的
      利用Mysql的锁来解决高并发的问题,先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL AUTO_INCR...
    99+
    2016-12-17
    更新库存时,你是如何用mysql锁解决高并发问题的
  • 利用Memcache缓存技术提高PHP应用的并发处理能力
    随着互联网的飞速发展,越来越多的应用程序需要面对大量的并发请求,如何提高应用的并发处理能力成为开发者们需要解决的问题。其中,利用Memcache缓存技术进行并发优化成为了相对较为流行的一种方案。Memcache是一种高效的缓存技术,适用于大...
    99+
    2023-05-18
    PHP Memcache 并发处理
  • Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
    目录前言架构设计代码实现测试总结前言 最近在做阅读类的业务,需要记录用户的PV,UV; 项目状况:前期尝试业务阶段; 特点:快速实现(不需要做太重,满足初期推广运营即可)快速投入市场...
    99+
    2024-04-02
  • 如何在Go语言中高效处理并发、存储和数据类型?
    Go语言是一种开源编程语言,由Google开发。它的并发模型和内存管理机制是其最大的特点之一,同时也被广泛应用于网络编程、云计算、大数据处理等领域。在本文中,我们将介绍如何在Go语言中高效处理并发、存储和数据类型。 一、并发处理 Go语言的...
    99+
    2023-08-20
    并发 存储 数据类型
  • ASP网站使用分布式缓存,如何实现高效的并发处理?
    随着互联网的不断发展,越来越多的网站开始面临并发访问的问题,而分布式缓存技术正是为解决这一问题而诞生的。在本文中,我们将介绍如何在ASP网站上使用分布式缓存来实现高效的并发处理。 一、什么是分布式缓存? 分布式缓存是一种将数据缓存在多台服...
    99+
    2023-10-21
    分布式 缓存 并发
  • 提高数据库处理速度的利器——MySQL存储过程详解
    存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存...
    99+
    2022-05-17
    MySQL SQL 函数 分隔符 判断 变量 存储过程 循环 注释 迭代
  • PHP 分布式架构中的缓存优化:如何提高并发处理能力?
    PHP分布式架构中的缓存优化:如何提高并发处理能力? 在现代的大型Web应用程序中,处理并发请求是一个非常重要的问题。为了满足大量请求的需求,许多应用程序都采用了分布式架构,其中缓存是一个非常重要的组成部分。在本文中,我们将讨论如何在PHP...
    99+
    2023-09-22
    分布式 并发 缓存
  • PHP缓存技术如何提高自然语言处理程序的并发性能?
    自然语言处理(NLP)是一种涉及计算机与人类自然语言交互的领域。NLP技术正在越来越多地应用于各种应用程序中,从智能助手到翻译软件。然而,由于NLP技术需要大量的计算资源,因此它们在高并发环境下的性能可能会受到影响。本文将介绍如何使用PH...
    99+
    2023-08-02
    缓存 自然语言处理 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作