问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何控制高并发,比如现在商品表10个商品,有10000个人同时下单购买,这个时候我们如何处理这种情况?

发布网友 发布时间:2022-05-01 07:04

我来回答

3个回答

懂视网 时间:2022-05-01 11:26

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

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

举例:

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

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

标签:

热心网友 时间:2022-05-01 08:34

这种时候可以通过队列,比如每次有人下单,就丢到队列里面,然后队列里面校验库存,这样有并发的时候也只是多插入了队列,但是队列里面是依次执行的。队列的话可以参考下redis如何做队列处理。有php相关扩展的,java的话我就不清楚了。

热心网友 时间:2022-05-01 09:52

楼上的是正经,用redis或者其他的非关系型数据库,放到队列里面。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 楼梯的水泥台阶上可以铺地板革吗 手机腾讯会议共享屏幕播放视频没声 河南南阳方城金玉成门厂 美术艺考生未来就业前景怎么样 请问在未来美术上学画画的效果好不好?教的怎么样? 请问河南省南阳市哪些地方家具厂,木门厂,浴柜厂比较集中啊? 我南阳工地项目想用一批防火门选择哪一个厂家好呢?最好是河南的防火门! 在线学青少年美术,未来美术能教几岁到几岁的啊? 南阳市金瑞祥不锈钢门业有限公司怎么样? 现在有个未来美术你们知不知道?靠谱吗? 南阳市盛隆门窗有限公司怎么样? 美术对未来社会的影响 南阳电动伸缩门厂家 未来美术、美术宝哪个学美术更好? 南阳高新区金利自动门机厂怎么样? 未来美术怎么样? 魔兽世界 一些问题 南阳市卧龙区佳艺门厂交不交五险一金 未来美术怎么样?知道的家长来说一说吧 南阳市艺峰门业有限公司怎么样? 女鞋 叫什么 凯奇 染过黑色的头发就不能染其他颜色了吗 南阳市中正自动门窗有限公司怎么样? 可以去未来美术吗? 南阳乐都幕墙门窗有限公司怎么样? 南阳市振红不锈钢门窗销售有限公司怎么样? 南阳市中正实业有限公司怎么样? 南阳铝合金门窗型材生产厂家 河南南阳的 想开厂生产钢木门 不知道能有销路没 南阳市福匠家居有限公司怎么样? 请问:精尺门窗牌子,是属于,哪个公司的介绍下? 南阳市鸿诚实业有限责任公司怎么样? 河南省南阳市唐河县家具厂集中在哪些地方啊?还有洛阳市家具厂,木门厂,浴柜厂,集中在哪些地方啊? 大学师范类专业入团真的很难吗? 铭瑄1080超频能超多少 现在1080显卡的配置有没有超频的必要呢,另外请大神替我看看这套配置兼容不π_π 1080ti超频比不超频好在哪,有必要买超频吗 技嘉GTX1080 G1 超频9% 可以常年使用吗?会影响寿命吗 显卡怎么超频啊?听说什么拉频率什么的,会影响显卡保修吗?显卡是华硕1080ti。 我的i7 7700k和1080TI显卡要超频,要用多少额定的电源好呢? 索泰gtx1080至尊plus 这块显卡最多能超频多少? GeForce GTX 1080ti (11GB&#47;七彩虹)显卡后按钮,是按下超频,还是弹出超频?