Maison > cadre php > Laravel > Solution détaillée : utilisez Laravel pour résoudre le problème de débordement d'inventaire

Solution détaillée : utilisez Laravel pour résoudre le problème de débordement d'inventaire

藏色散人
Libérer: 2021-06-09 09:08:16
avant
2560 Les gens l'ont consulté

La colonne tutorielle suivante de laravel vous présentera plusieurs solutions pour utiliser laravel pour résoudre les débordements d'inventaire. J'espère qu'elle sera utile aux amis dans le besoin !

Champs de la base de données

Solution détaillée : utilisez Laravel pour résoudre le problème de débordement dinventaire

1. Démonstration d'erreur

    /**
     * 错误示范
     * 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";

    }
Copier après la connexion

Utilisez go pour simuler la concurrence

package mainimport (
    "fmt"
    "github.com/PeterYangs/tools/http"
    "sync")func main() {

    client := http.Client()

    wait := sync.WaitGroup{}

    for i := 0; i <.>Afficher l'inventaire dans la base de données<p></p>
<p><img src="https://img.php.cn/upload/article/000/000/020/b3a44af246aab48e87b85467ea9f1568-1.png" alt="Solution détaillée : utilisez Laravel pour résoudre le problème de débordement dinventaire"><br>Inventaire dépassé<strong></strong></p>
<h2>
<span class="header-link octicon octicon-link">2. Redis Atomic Lock</span><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();
        }
    }
Copier après la connexion

L'inventaire est normal

Solution détaillée : utilisez Laravel pour résoudre le problème de débordement dinventaire

3.mysql verrouillage pessimiste
    /**
     * 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) {

        }

    }
Copier après la connexion

L'inventaire est normal

Solution détaillée : utilisez Laravel pour résoudre le problème de débordement dinventaire

4.mysql verrouillage optimiste
    /**
     * 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';


    }
Copier après la connexion

L'inventaire est normal

Solution détaillée : utilisez Laravel pour résoudre le problème de débordement dinventaire

Optimiser le verrouillage optimiste

Modifier l'inventaire SQL en

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal