防止しますか?私は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の要求待ちがあるか)