mysql防止商品超卖_避免商品超卖的4种方案

原始方案(失败):在每次下订单前我们判断促销商品的数量够不够,不够不允许下订单,更改库存量时加上一个条件,只更改商品库存大于0的商品的库存,当时我们使用ab进行压力测试,当并发超过500,访问量超过2000时,还是会出现超卖现象。

public functionbuyOne()

{$shop = Shop::find(1);if ($shop->number > 0) {

DB::update("update shop set number = number - 1 where id = 1");

}

}

第1种方案:使用mysql的事务加排他锁来解决,首先我们选择数据库的存储引擎为innoDB,使用的是排他锁实现的,刚开始的时候我们测试了下共享锁,发现还是会出现超卖的现象。有个问题是,当我们进行高并发测试时,对数据库的性能影响很大,导致数据库的压力很大。

//2.利用数据库的forupdate来加锁(在数量少的情况下并不会出现问题,但是当并发达到(ab -n 1000 -c 200),

//就会出现请求非2XX的响应增多,1000 失败了 60)time per request 65.195

//在高并发的情况下,会导致数据库连接数不够,部分php获取不到连接而报错,或者是超过等待时间而报错

public functionindexMysql()

{

DB::beginTransaction();//通过for update 加排它锁

$shop = DB::table(&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超卖是指在高并发情况下,多个用户同时购买同一商品,导致库存减少超过实际数量的情况。为了解决这个问题,可以使用Redis和MySQL的组合。 一解决超卖问题的方法是使用Redis作为缓存,将商品的库存数量存储在Redis中,并在用户购买时进行库存的检查和更新。具体步骤如下: 1. 在MySQL中创建一个商品表,包含商品的id、库存数量等字段。 2. 在Redis中创建一个键值对,键为商品的id,值为库存数量。 3. 当用户购买商品时,首先从Redis中获取商品的库存数量。 4. 如果库存数量大于0,则进行购买操作,并将库存数量减1。 5. 同时更新MySQL中的库存数量,确保数据的一致性。 6. 如果库存数量为0,则表示商品已售罄,无法购买。 以下是一个使用PHP和Redis解决超卖问题的示例代码: ```php // 获取商品库存数量 $sql = "select id, num, money from ims_hotmallstore_goods where id=".$goods_id; // 执行SQL查询操作... // 从Redis中获取商品库存数量 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $stock_key = 'goods_stock:'.$goods_id; $stock = $redis->get($stock_key); // 判断库存数量是否大于0 if ($stock > 0) { // 进行购买操作 $sql = "update ims_hotmallstore_goods set num=num-1 where num>0 and id=".$goods_id; // 执行SQL更新操作... // 更新Redis中的库存数量 $redis->decr($stock_key); // 返回购买成功的信息 echo "购买成功!"; } else { // 返回库存不足的信息 echo "库存不足!"; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值