mrsombre
@mrsombre
Веб-программист

Как избежать дублирования данных в MySQL при параллельных запросах?

Проблема такая: нужно записывать UserAgent запроса в лог, причем реалтайм, то есть постфактум анализ серверных логов не подходит. Есть таблица uag с двумя полями - id, value. Соответственно, если мы встречаем новый uag, мы его пишем в таблицу с назначением id, а в лог пишем уже id.
Проблема в том, что иногда от одного клиента может пройти несколько конкурентных запросов, тогда у нас проверка на наличие записи не срабатывает и получается несколько дублей. Можно было бы решить это с unique index/constraint, но не позволяет максимальная длина ключа (uag-ги бывают досточно длинные). Lock tables может вызывать разные стремные ошибки.
Пока в голову приходит только mutex таблица, но как-то усложнено выглядит. Может быть есть рабочие варианты?
  • Вопрос задан
  • 491 просмотр
Пригласить эксперта
Ответы на вопрос 2
Denormalization
@Denormalization
Если не можете сделать unique по самому UA, то почему не сделать unique по его хешу? Добавляете еще один столбец, и пишете туда хеш UA, и на него вешаете unique.

Хеш можно брать любой доступной функцией.
Ответ написан
opium
@opium
Просто люблю качественно работать
использовать upsert и все будет пучком
уник по юзерагенту конечно же при этом
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы