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

藏色散人
Freigeben: 2021-06-09 09:08:16
nach vorne
2552 Leute haben es durchsucht

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

    }
Nach dem Login kopieren

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 
Nach dem Login kopieren

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();
        }
    }
Nach dem Login kopieren

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

        }

    }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage