欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  神坛PHP

laravel解决库存超出问题

程序员文章站 2022-01-30 20:46:40
...

假设数据库的 num表示库存

redis原子锁

/**

 * 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 <= 0) {

            return "卖光啦!!";

        }

        //仓库减1

        $product->decrement('num');

        return 'success';

    }catch (LockTimeoutException $e) {

        return '当前人数过多';

    } finally {

        optional($lock)->release();

    }

}


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

            return "卖光啦!!";

        }

        //仓库减1

        $product->decrement('num');

        \DB::commit();

        return "success";

    } catch (\Exception $exception) {


    }

}



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

        return "卖光啦!!";

    }

    //修改前检查库存和之前是否一致,不一致说明已经有变动,则放弃更改

    $res = \DB::update('UPDATE `product` SET num = num -1 WHERE id = ? AND num=?', [$id, $product->num]);

    if (!$res) {

        return '当前人数过多';

    }

    return 'success';

}



相关标签: 库存 超出