• 技术文章 >php框架 >Laravel

    方案详解:使用laravel解决库存超出问题

    藏色散人藏色散人2021-06-09 09:08:16转载86
    下面由laravel教程栏目给大家介绍使用laravel解决库存超出的几个方案,希望对需要的朋友有所帮助!

    数据库字段

    使用laravel解决库存超出的几个方案

    1.错误的示范

        /**
         * 错误示范
         * Create by Peter Yang
         * 2021-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()}

    在数据库中查看库存

    使用laravel解决库存超出的几个方案
    库存已超出

    2.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();
            }
        }

    库存正常

    使用laravel解决库存超出的几个方案

    3.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) {
    
            }
    
        }

    库存正常

    使用laravel解决库存超出的几个方案

    4.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';
    
    
        }

    库存正常

    使用laravel解决库存超出的几个方案

    优化乐观锁

    修改库存的sql修改为

    \DB::update('UPDATE `product` SET num = num -1 WHERE id = ? AND num-1 >= 0', [$id]);

    以上就是方案详解:使用laravel解决库存超出问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:mysql laravel
    上一篇:Laravel Tinker是啥?怎么用? 下一篇:分享关于laravel-octane的体验及压测
    第16期线上培训班

    相关文章推荐

    • laravel-admin怎么使用wang-editor富文本插件• Laravel生成url模式的三种方法• Laravel Tinker是啥?怎么用?• 基于PHP Laravel,聊聊少写PHP "烂"代码的方法!!

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网