小兔网

下面由laravel教程栏目给大家介绍使用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解决库存超出问题-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解决库存超出问题-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解决库存超出问题-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解决库存超出问题-Laravel

优化乐观锁

修改库存的sql修改为

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

以上就是方案详解:使用laravel解决库存超出问题的知识。速戳>>知识兔学习精品课!