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

2022-05-15 0 562

下面由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]);

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 方案详解:使用laravel解决库存超出问题 https://www.jike1995.com/36967.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务