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