Heim >PHP-Framework >Laravel >Detaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen

Detaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen

藏色散人
藏色散人nach vorne
2021-06-08 15:15:122550Durchsuche

Die folgende Tutorial-Kolumne von laravel stellt Ihnen verschiedene Lösungen vor, wie Sie mit Laravel einen Inventarüberlauf beheben können. Ich hoffe, dass es Freunden in Not hilfreich sein wird!

Datenbankfelder

Detaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen

1. Fehlerdemonstration:

2. Redis Atomic Lock

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

    }

Stock ist normal

Detaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen

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

    client := http.Client()

    wait := sync.WaitGroup{}

    for i := 0; i 

Stock ist. normal

Detaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen

4.mysq lch optimistisches Schloss
    /**
     * 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();
        }
    }

Der Lagerbestand ist normal

Detaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen

Optimistische Sperre optimieren

Ändern Sie die Inventar-SQL in

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

        }

    }

Das obige ist der detaillierte Inhalt vonDetaillierte Lösung: Verwenden Sie Laravel, um das Problem des Inventarüberlaufs zu lösen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen