Maison  >  Article  >  cadre php  >  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

藏色散人
藏色散人avant
2021-06-08 15:15:122501parcourir

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";

    }

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();
        }
    }

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) {

        }

    }

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';


    }

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]);

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer