ホームページ  >  記事  >  PHPフレームワーク  >  詳細な解決策: Laravel を使用して在庫オーバーフローの問題を解決する

詳細な解決策: Laravel を使用して在庫オーバーフローの問題を解決する

藏色散人
藏色散人転載
2021-06-08 15:15:122511ブラウズ

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 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 データベース内のインベントリを表示<p></p><p><img src="https://img.php.cn/upload/article/000/000/020/b3a44af246aab48e87b85467ea9f1568-1.png" alt="詳細な解決策: Laravel を使用して在庫オーバーフローの問題を解決する"><br>インベントリが次を超えています<strong></strong></p><h2>##2.redis アトミック ロック<span class="header-link octicon octicon-link"><pre class="brush:php;toolbar:false">    /**
     * 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 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 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 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。