Стек: Laravel 9.26, Octane 1.3, Swoole 4.8.5, MariaDB 10.7
Есть следующая проблема:
Во время отправки параллельных запросов данные могут измениться несколько раз вне зависимости от проверки наличия этих данных в БД. Другими словами если к примеру эмулировать 5 одновременных запросов на 1 метод - то код может выполнится столько раз - сколько свободных потоков в Octane, при том проверка на созданную запись в коде не проходит корректно и создается дублирующая запись.
Приведу пример, есть контроллер в котором есть функция для создания лайка на запись:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function like(Request $request)
{
$request->validate([
'uuid' => 'required',
]);
$user = $request->user();
$post = Post::whereUuid($request->uuid)->first();
abort_if(!$post, 404);
if (!$post->likes()->whereAccountId($user->id)->exists()) {
$post->likes()->attach($user);
}
$post->loadCount(['likes']);
return response()->json([
'ok' => true,
'likes_count' => $post->likes_count,
]);
}
}
Роут:
Route::post('post/like', [\App\Http\Controllers\PostController::class, 'like']);
На js выполняю 5 запросов в цикле, после чего может сохраниться от 1 до 4 лайков в БД (смотря сколько потоков запущено для Octane)
Подскажите, пожалуйста, как можно решить данную проблему, чтобы конкретный код не выполнялся в многопоточном режиме?