文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php教程>方案详解:使用laravel解决库存超出问题

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

时间:2021-06-11  来源:互联网

今天PHP爱好者给大家带来下面由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爱好者其它相关文章!

相关阅读更多 +
最近更新
排行榜 更多 +
元梦之星最新版手游

元梦之星最新版手游

棋牌卡牌 下载
我自为道安卓版

我自为道安卓版

角色扮演 下载
一剑斩仙

一剑斩仙

角色扮演 下载