方案详解:使用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.WaitGroup) {

            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)配置教程