方案详解:使用laravel解决库存超出问题
发布时间 - 2021-06-08 00:00:00 点击率:次下面由laravel教程栏目给大家介绍使用laravel解决库存超出的几个方案,希望对需要的朋友有所帮助!
数据库字段
1.错误的示范
/**
* 错误示范
* Create by Peter Yang
* 2025-06-08 10:57:59
* @return string
*/
function test1()
{
//商品id
$id = request()->input('id');
$product = Product::where('id', $id)->firstOrFail();
if ($product->num <= 0) {
return "卖光啦!!";
}
//仓库减1
$product->decrement('num');
return "success";
}使用go模拟并发
package mainimport (
"fmt"
"github.com/PeterYangs/tools/http"
"sync")func main() {
client := http.Client()
wait := sync.WaitGroup{}
for i := 0; i < 50; i++ {
wait.Add(1)
go func(w *sync.WaitG
roup) {
defer wait.Done()
res, _ := client.Request().GetToString("http://www.api/test1?id=1")
fmt.Println(res)
}(&wait)
}
wait.Wait()}在数据库中查看库存
库存已超出
2.redis原子锁
/**
* redis原子锁
* Create by Peter Yang
* 2025-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();
}
}库存正常
3.mysql悲观锁
/**
* mysql悲观锁
* Create by Peter Yang
* 2025-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) {
}
}库存正常
4.mysql乐观锁
/**
* mysql乐观锁
* Create by Peter Yang
* 2025-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';
}库存正常
优化乐观锁
修改库存的sql修改为
\DB::update('UPDATE `product` SET num = num -1 WHERE id = ? AND num-1 >= 0', [$id]);
# mysql
# laravel
# sql
# 并发
# redis
# 数据库
# 卖光
# 几个
# 最多
# 给大家
# 数据库中
# 抛出
# string
# function
# return
# Yang
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
如何在万网自助建站中设置域名及备案?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何安全更换建站之星模板并保留数据?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
千库网官网入口推荐 千库网设计创意平台入口
制作企业网站建设方案,怎样建设一个公司网站?
如何在搬瓦工VPS快速搭建网站?
nodejs redis 发布订阅机制封装实现方法及实例代码
进行网站优化必须要坚持的四大原则
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
网站优化排名时,需要考虑哪些问题呢?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
创业网站制作流程,创业网站可靠吗?
简历没回改:利用AI润色让你的文字更专业
如何快速重置建站主机并恢复默认配置?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
高性价比服务器租赁——企业级配置与24小时运维服务
JavaScript Ajax实现异步通信
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
如何构建满足综合性能需求的优质建站方案?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何处理异常和错误?(Handler示例)
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
制作公司内部网站有哪些,内网如何建网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
Android利用动画实现背景逐渐变暗
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel如何发送系统通知?(Notification渠道示例)
如何快速使用云服务器搭建个人网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
清除minerd进程的简单方法
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程


roup) {
defer wait.Done()
res, _ := client.Request().GetToString("http://www.api/test1?id=1")
fmt.Println(res)
}(&wait)
}
wait.Wait()}