Transient Mysql :: Ошибка: повторяющаяся запись на сайте с большим трафиком - есть идеи? - PullRequest
5 голосов
/ 06 февраля 2011

В моих журналах надежды я периодически вижу

Mysql :: Ошибка: Дублирующая запись 'XXXX' для ключа 'YYY'

Это происходит для большинства моихмоделей, всего около 6, и я буду видеть эту ошибку раз в несколько часов на сайте, выполняющем около 5 000 запросов в минуту в соответствии с newrelic.

Я выполняю ActiveRecord.find_or_initialize_by в каждом из этих случаев.Возможно, но маловероятно, что это происходит из-за того, что клиент в полевых условиях делает две одновременные публикации одних и тех же данных, потому что это мобильные клиенты, и код пути на самом деле не поддается этому (т. Е. Это не нажатие клиентакнопка отправки дважды быстро).

Известна ли проблема с find_or_initialize_by?Возможно ли, что мой экземпляр mysql (Amazon RDS) так часто просто отключается (хотя я ожидал, что в этом случае он вызовет исключение по сравнению с возвратом данных) ...

Более того, есть лилучший способ вставки записей?Если запись существует, я обычно обновляю только ее поле updated_at.

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Скорее всего, это происходит потому, что «проверить правильность, а затем вставить» не является атомарной операцией.Нет гарантии, что кто-то другой не сможет вставить строку с тем же значением для уникального столбца между проверкой достоверности и вставкой.

Официальные документы упоминают об этом, но только вмимоходом, и они действительно не очень хорошо это объясняют. Rails Warts имеет гораздо лучшую страницу по этой проблеме.

И, похоже, вы поддерживаете условие уникальности с помощью уникального индекса в вашей БД, вы уже делаете то, чтоВы можете предотвратить это на стороне БД.И я не уверен, является ли find_or_initialize_by / ON DUPLICATE KEY UPDATE хорошей идеей или нет - это зависит от того, что редактируют ваши пользователи, и последствий для безопасности, связанных с редактированием того, что они не обязательно намеревались.

Надеюсь, это поможет!

0 голосов
/ 06 февраля 2011

У меня есть этот сайт sinograms.com.Я делаю скрины на новостных сайтах, чтобы классифицировать китайские иероглифы по частоте, и я нашел то же самое, что и вы.

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

...