在phalcon里实现悲观锁,保证库存不超卖

 前言:库存超卖问题是在很多场景都会出现的问题,有很多种方式来解决这里问题,这里讲的是通过mysql悲观锁来实现库存不超卖。

一、什么是悲观锁

        悲观锁是指对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态,在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。

二、代码实现

use Phalcon\Di;

// 开启事务
$connection = Di::getDefault()->get('mysql实例名'); // 这是一个mysql实例
$connection->begin();
try {
    // 查询对应的奖品信息
    $currentPrize = Prize::findFirst([
                "id = :id:",
                'bind' => [
                    'id' => $prize['id']
                ],
                "for_update" => true
            ]);

    // 判断当总库存减去已消耗的库存大于小于0的时候则无获取奖品
    if ($currentPrize->stock - $currentPrize->consume <= 0) {
       $connection->commit();
       // 这里写无奖品的逻辑
    }

    
    // 这里执行增加消耗库存
    $currentPrize->save(['consume' => $currentPrize->consume + 1]);
    $connection->commit();

} catch (\Exception $e) {
    $connection->rollback();
    return $this->response([
               'message' => '抽奖失败'
            ], 400);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值