Как предотвратить состояние гонки Laravel 11 [дублировать]MySql

Форум по Mysql
Ответить
Anonymous
 Как предотвратить состояние гонки Laravel 11 [дублировать]

Сообщение Anonymous »

У меня есть таблица с именем gym_sessions у нее есть user_id | Статус < /strong> столбцы.

CATST CULEN CAN CAN: 1 ==> Active; 2 ==> завершено; 3 ==> отклонено;

Условия: < /strong> < /p>

У пользователя должен быть достаточный баланс, чтобы запустить новый сеанс. 3; < /li>
< /ul>
Это мой метод создания нового сеанса для пользователя: < /p>
// Start new gym session.
public function startGymSession(Request $request){
$validator = Validator::make($request->all(),[
'gym_id' => ['required', 'exists:gyms,id'],
'payment_method_id' => ['required', 'exists:payment_methods,id'],
'gym_pricing_id' => ['required',
Rule::exists('gym_pricings', 'id')->where(function ($query) use ($request) {
$query->where('gym_id', $request->input('gym_id'));
}),
],
]);
if($validator->fails()){
return $this->sendError('Validation error!');
}

$user = Auth::user();

// Check if the user have enough balance to start a gym session.
$userbalance = $user->wallet_balance;
$gymPricing = GymPricing::find($request->gym_pricing_id)->first();
if($userbalance < $gymPricing->price){
return $this->sendError('Insufficient balance.');
}

// Check if the user have active gym sessions.
// If the user have active gym sessions, he can't start a new one.
// Prevent race condition.

/** @var \App\Models\User $user */
if($user->gymSessions()->where('status', 1)->count() > 0){
return $this->sendError('You have an active gym session.');
}

$now = Carbon::now();

// Start the gym session.
$gymSession = GymSession::create([
'user_id' => $user->id,
'gym_id' => $request->gym_id,
'payment_method_id' => $request->payment_method_id,
'gym_pricing_id' => $request->gym_pricing_id,
'entry_time' => $now,

]);
if($gymSession){
return $this->sendResponse([], 'Gym session started.');
}

return $this->sendError('Failed to start gym session.');
}
< /code>
Сценарий атаки: < /strong> (условие гонки)

Если пользователь отправил несколько запросов параллельно, система создаст множество сеансов со статусом 1. < /p>
Я хочу знать, как предотвратить эту проблему на уровне применения (с использованием ларавелей). />
laravel 11

mysql

php 8.2.8 < /p>

Подробнее здесь: https://stackoverflow.com/questions/794 ... laravel-11
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»