在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);
}

猜你喜欢

转载自blog.csdn.net/qq_27295403/article/details/122193259