欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-02 11:23:38
...

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

一、什么是悲观锁

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

二、代码实现

use Phalcon\Di;

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

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

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

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