2017-03-04 20 views
2

防止しますか?私はLaravel中のトランザクションが更新をブロックしていることを理解し、どのように私が使用しているから古いデータを防ぐのですか?別のトランザクションが行われている間にデータベースを読み込みからロックする方法はありますか? (すなわち、第2の要求が第1の要求が完了するのを待つ)は私がoccuringから、このような競合状態を防ぐにはどうすればよい(Laravelを)データベーストランザクションを使用した競合状態を

主キーid = 7のデータベースのユーザ名フィールドがヌルであるとする。

リクエスト1がで来て、これを行います:

public function raceCondition1() { 

    DB::beginTransaction(); 

    //Get the model with primary key 7 
    $user = User::findorfail(7); 

    sleep(6); 

    $user->username = 'MyUsername'; 

    $user->save(); 

    DB::commit(); 
} 

秒後、私は、ユーザー名の欄に何かを連結し、節約リクエスト2を、実行します。

public function raceCondition2() { 

    DB::beginTransaction(); 

    $user = User::findorfail(7); 

    sleep(6); 

    $user->username = 'USER_' . $user->username; 

    $user->save(); 

    DB::commit(); 
} 

データベースのこの場合の結果は次のとおりUSER_

前に、データベースから読み出した第2のリクエスト最初の要求が保存され、失効したNULL値が使用される可能性があります。別のトランザクションが行われている間にデータベースを読み込みからロックする方法はありますか?あなたは、クエリを実行し、その実行中のエラーの可能性がある場合、得られた変更を逆転させる機構を有することを希望している場合(即ち、完了した最初の要求に対する第2の要求待ちがあるか)

答えて

0

トランザクションが使用されます。

あなたが探していることは、データベースへのすべての要求をキューに入れて、前が処理されている場合にのみ処理されるロック方法、であるとして。

私は、これはlaravelのORMから箱から出てくるが、それは簡単に古典的なSQLクエリから実装することができますかどうかわかりません。

このリンクを確認して、メカニズム全体がどのように機能するかを理解するために、あなたが探しているのは行レベルロックです。

Locking Methods

関連する問題