Laravel`increation()`是否锁定了行?

时间:2016-07-21 13:26:42

标签: mysql laravel race-condition

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

例如:

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

如果在比赛条件下从两个不同的位置调用,第二个调用是否会覆盖第一个增量,我们最终只得到5分?或者他们会加起来,我们最终获得10分?

1 个答案:

答案 0 :(得分:2)

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

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

因此,您可以对所获得的内容感到满意,因为它可以在任意数量的并发呼叫中正常工作:

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

并且以起始值零调用两次将结束10