在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);
}
上一篇: 乐观锁和悲观锁的区别
下一篇: 乐观锁 和 悲观锁 的用法和区别