laravel解决库存超出问题
假设数据库的 num表示库存
redis原子锁
/**
* redis原子锁
* Create by Peter Yang
* 2021-06-08 11:00:31
*/
function test2()
{
//商品id
$id = request()->input('id');
$lock = \Cache::lock("product_" . $id, 10);
try {
//最多等待5秒,5秒后未获取到锁,则抛出异常
$lock->block(5);
$product = Product::where('id', $id)->firstOrFail();
if ($product->num <= 0) {
return "卖光啦!!";
}
//仓库减1
$product->decrement('num');
return 'success';
}catch (LockTimeoutException $e) {
return '当前人数过多';
} finally {
optional($lock)->release();
}
}
mysql悲观锁
/**
* mysql悲观锁
* Create by Peter Yang
* 2021-06-08 11:00:47
*/
function test3()
{
//商品id
$id = request()->input('id');
try {
\DB::beginTransaction();
$product = Product::where('id', $id)->lockForUpdate()->first();
if ($product->num <= 0) {
return "卖光啦!!";
}
//仓库减1
$product->decrement('num');
\DB::commit();
return "success";
} catch (\Exception $exception) {
}
}
mysql乐观锁
/**
* mysql乐观锁
* Create by Peter Yang
* 2021-06-08 11:00:47
*/
function test4()
{
//商品id
$id = request()->input('id');
$product = Product::where('id', $id)->first();
if ($product->num <= 0) {
return "卖光啦!!";
}
//修改前检查库存和之前是否一致,不一致说明已经有变动,则放弃更改
$res = \DB::update('UPDATE `product` SET num = num -1 WHERE id = ? AND num=?', [$id, $product->num]);
if (!$res) {
return '当前人数过多';
}
return 'success';
}
上一篇: 解决Android中Webview软键盘与沉浸式的冲突的几种方式的分析
下一篇: JPA調用存儲過程
推荐阅读
-
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
-
laravel 解决后端无法获取到前端Post过来的值问题
-
解决layui表格内文本超出隐藏的问题
-
解决Laravel blade模板转义html标签的问题
-
解决laravel 出现ajax请求419(unknown status)的问题
-
Redis解决库存超卖问题实例讲解
-
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
-
解决height:100vh超出屏幕高度的问题
-
laravel 解决后端无法获取到前端Post过来的值问题
-
Laravel 5.4.36中session没有保存成功问题的解决