У меня есть таблица с именем 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
Как предотвратить состояние гонки Laravel 11 [дублировать] ⇐ MySql
Форум по Mysql
-
Anonymous
1741608479
Anonymous
У меня есть таблица с именем [b] gym_sessions [/b] у нее есть 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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79497849/how-to-prevent-race-condition-laravel-11[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия