Я попал в состояние гонки в моем приложении Laravel, когда пытаюсь условно ВСТАВИТЬ или ОБНОВИТЬ, какие-либо предложения …?

Мои пользователи должны иметь возможность загружать файлы на мой сайт, поэтому я реализовал виджет загрузки файлов на веб-интерфейсе. Он допускает несколько загрузок одновременно, и каждая загрузка запускает код по одному файлу за раз, чтобы сохранить файл в БД.

Проблема заключается в том, что файлы должны храниться в виде массива в одной строке в базе данных (я знаю, я знаю … устаревшие причины).

В английском псевдокоде вот что происходит:

  1. Laravel видит, что новый файл был загружен
  2. Laravel проверяет, были ли какие-либо файлы (вообще) загружены в эту сущность
  3. Файлы еще не загружены? Создайте новую запись для хранения этого файла.
  4. Уже есть файлы для этого объекта? Обновите существующую запись, чтобы добавить этот файл в массив.

Проблема в том, что когда несколько файлов загружаются одновременно в быстрой последовательности в первый раз, Laravel вводит первый файл в моменты базы данных после второй файл провел проверку, чтобы увидеть, существуют ли какие-либо файлы. Таким образом, мы получаем дублирующие строки, а не обновляем их в одну запись.

Если я загружаю 5 файлов одновременно, обычно я получаю 4 строки в базе данных — 3 отдельные записи и одну двойную запись, которые удалось наверстать упущенное во времени.

Есть ли практические способы обойти эту проблему? Я знаю, что мне следует использовать схему базы данных «многие к одному», но для краткости я значительно упростил и без того сложную ситуацию!

Это Laravel 5.2, использующий базу данных MySQL InnoDB.

1

Решение

План A: Когда вы увидите один новый файл, подождите немного. Затем найдите «все» файлы и разберитесь с ними.

План Б: Сохраните отметку времени вместе с записью. Когда другой файл замечен, посмотрите, существует ли существующая запись с «недавней» отметкой времени. Если это так, предположим, что это часть одной и той же «группы».

Оба Плана будут время от времени есть икота — в основном из-за расплывчатого определения «сразу».

Возможно, у вас сейчас есть другая проблема: файл загружается наполовину, когда вы его захватываете, и вы получаете неполный файл?

«Настоящий» ответ — загрузить «сообщение» после завершения. Затем не начинайте обработку, пока не увидите ее. (Я понимаю, что это, вероятно, не практично.)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]