2016-07-21 1 views
1

EloquentモデルのLaravel increment()を呼び出すと、行がロックされますか?例えばLaravel `increment()`は行をロックしていますか?

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

これは競合状態にある2つの異なる場所から呼び出された場合は、2番目の呼び出しは、最初の増分を上書きすると、我々はまだわずか5ポイントで終わりますか?あるいは、彼らは合計して10ポイントになるでしょうか?

+0

これはデータベースの実装に依存しますが、デフォルトの設定で10になるはずです - つまり、トランザクションごとにテーブルをロックすることを意味します。 –

+0

申し訳ありませんが、それが起こる可能性は十分に低いので、私はその前提についていくつもりです。 – Pat

+1

これは似たようなものです:http://stackoverflow.com/questions/30527318/mysql-concurrent-updates-through-threads-on-a-simple-table –

答えて

2

答えてください(今後の読者に役立ちます):質問している問題は、データベースの構成によって異なります。

ほとんどのMySQLエンジン:MyISAMとInnoDBなど。この機能を明示的にオフにするまで、テーブルを挿入、更新、または変更する際にロックを使用します。 (とにかく、これはほとんどの場合、唯一正しいと理解しやすい実装である)

それは同時呼び出し、任意の数では正確に動作しますので、あなたは、あなたが得たものと快適に感じることができます。

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

と呼び出しこれは2回の開始値が0で終了します

関連する問題