>  기사  >  PHP 프레임워크  >  세부 해결 방법: laravel을 사용하여 재고 초과 문제 해결

세부 해결 방법: laravel을 사용하여 재고 초과 문제 해결

藏色散人
藏色散人앞으로
2021-06-08 15:15:122472검색

다음 튜토리얼 칼럼인 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>
<span class="header-link octicon octicon-link"></span>2 .redis 원자 잠금 </h2> <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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제