У меня есть приложение, которое получает несколько запросов от внешних источников (счета от торговых точек). Он получает десятки запросов в секунду, и некоторые из этих запросов одинаковы (имеют одинаковое тело запроса).
данные запроса преобразуются и сохраняются в две связанные таблицы (внешний ключ). если запись уже существует (запрашивается по уникальному составному ключу), запись обновляется, в противном случае запись добавляется.
проблема в том, что иногда, если два запроса с одинаковым телом получены одновременно, приложение выдает исключение, что уникальный ключ уже существует, и он не может вставить его:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
Это, вероятно, какое-то состояние гонки в MySQL, но не могу понять
Весь процесс обернут в транзакцию Laravel. Я пытался установить разные уровни изоляции. SERIALIZABLE решает эту проблему, но затем я получаю множество исключений взаимоблокировок, и, как я вижу, иногда запись вообще не сохраняется.
Это просто, что здесь происходит, у вас есть какое-то значение, объявленное как «УНИКАЛЬНЫЙ» или «Первичный ключ» или что-то в этом роде, и вы пытаетесь вставить снова, какое-то ключевое ограничение блокирует вставку, это должно быть хорошо, вы избегаете дубликаты записей в вашей базе данных, но что вам нужно сделать, это проверить, существуют ли данные, которые вы пытаетесь вставить, ранее в базе данных, а не во всех столбцах, вы должны спросить ваши ключи или комбинацию клавиш, я не могу вам помочь больше если я не знаю данные или таблицу …
Других решений пока нет …