У меня есть приложение Laravel 5.2 и приложение Angular 1. Они общаются с помощью REST API. Существует фрагмент кода, который обновляет некоторые данные базы данных при каждой загрузке страницы (приложение представляет собой браузерную игру, поэтому в этом случае ресурсы и юниты игрока обновляются / производятся), но я столкнулся с некоторыми проблемами.
Существуют ситуации, когда веб-интерфейс запрашивает несколько конечных точек API одновременно. Если новый блок был произведен с момента последнего запроса, Entity
должно быть attached()
к Player
модель (отношение «многие ко многим»). На самом деле все 3 запроса пытаются присоединить новый Entity
и в конечном итоге с SQL error: duplicate key
(не точная формулировка) на pivot
Таблица.
Проблема не изолирована от Eloquent, например, 3 запроса API одновременно приводят к созданию 3 отчетов и т. Д.
Как лучше всего решить эту проблему? До сих пор я пытался обернуть операторы БД DB::transaction
но это, похоже, не решило проблему (или я сделал это неправильно).
Спасибо за любой полезный ответ.
В соответствии с L5.2 исходный код attach
кажется, чтобы вставить запись в сводную таблицу каждый раз, когда вы запускаете ее.
Одним из решений может быть замена attach
с syncWithoutDetaching([entity_id])
,
Тем не менее, было бы еще лучше ограничить количество запросов до одного в вашем угловом приложении.
В конце концов я создал Команду Laravel, которая всегда работает в фоновом режиме:
while(true) {
updateUnitsExample();
$this->info('Units updated for time '. date("H:m:s"));
sleep(1);
}