【问题标题】:Does the Laravel `increment()` lock the row?Laravel `increment()` 是否锁定行?
【发布时间】:2016-07-21 13:26:41
【问题描述】:

在 Eloquent 模型上调用 Laravel increment() 会锁定行吗?

例如:

 $userPoints = UsersPoints::where('user_id','=',\Auth::id())->first();
 if(isset($userPoints)) {
      $userPoints->increment('points', 5);
 }

如果在竞争条件下从两个不同的位置调用它,第二个调用会覆盖第一个增量,我们最终仍然只有 5 分吗?或者他们会加起来,我们最终得到 10 分?

【问题讨论】:

标签: mysql laravel race-condition


【解决方案1】:

回答这个问题(对未来的读者有帮助):您所问的问题取决于数据库配置。

大多数 MySQL 引擎:MyISAM 和 InnoDB 等。在插入、更新或更改表时使用锁定,直到显式关闭此功能。 (无论如何,在大多数情况下,这是唯一正确且可理解的实现方式)

所以你可以对你得到的东西感到满意,因为它可以在任意数量的并发调用中正常工作:

-- this is something like what laravel query builder translates to
UPDATE users SET points += 5 WHERE user_id = 1

并以 0 的起始值调用它两次,最终将达到 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 2015-03-27
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多