【问题标题】:Laravel lockForUpdate + TransactionLaravel lockForUpdate + 事务
【发布时间】:2019-03-21 13:57:38
【问题描述】:

我们像这样使用 lockForUpdate:

DB::beginTransaction();

try {
    $balance = UserBalance::where('user_id', 2)
                    ->lockForUpdate()
                    ->first();
    $balance->usd += 100;
    $balance->save();

    // A LOT MORE LOGIC HERE

    $balance = UserBalance::where('user_id', 7)
                    ->lockForUpdate()
                    ->first();
    $balance->usd -= 100;
    $balance->save();

} catch (\Exception $e) {
    DB::rollback();
    return json_encode ([
        'success' => false,
        'message' => 'error',
    ]);
}
DB::commit();

一切正常,我在提交之前尝试了一些“睡眠(20)”并发送了另一个申请(没有睡眠)并且该行确实被锁定,但是我们面临一个问题。当我们从 cron 多次运行它时,似乎该函数运行在完全相同的毫秒上,然后锁似乎不起作用,这可能吗?除了使用队列,还有其他解决方案吗?

CRON 只是像这样多次调用路由:

* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test

【问题讨论】:

    标签: mysql laravel laravel-5 transactions pessimistic-locking


    【解决方案1】:

    我不明白为什么你需要在这里使用DB::transcation,因为这个操作是原子操作。

    你可以简单地做一个UserBalance::where('user_id', 2)->increment('usd', 100)

    这将向后端发送一个查询,将 usd 的值增加 100。

    【讨论】:

    • 数据库逻辑只是一个示例,在尝试中还有很多事情要做......但老实说,我不知道 -> 增量,谢谢.
    • 你能用 cron 任务更新你的问题吗?如果没有更多上下文,很难在这里看到您要实现的目标
    猜你喜欢
    • 2016-04-06
    • 2019-07-13
    • 2023-01-10
    • 2017-03-31
    • 1970-01-01
    • 2013-02-12
    • 2013-12-23
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多