У меня есть сайт с высоким трафиком, который записывает веб-хиты в таблице, Hits. Там логика на месте, чтобы дублировать хиты отбрасываются (где определение того, что определяет удар как дубликат, является произвольным для целей этого примера).
Проблема: при запуске нескольких веб-серверов (против одного и того же БД) два или более ударов могут одновременно появляться на разных веб-серверах и, с каждой точки зрения на сервере, ни один из них не дублирует (тогда как они были сериализованы через единственный сервер, кроме первого, должен быть отброшен). Следовательно, все они записываются в таблицу Hits.
Не изменяя схему БД, чтобы заставить уникальность в поле в таблице Хитов, как заставить Rails синхронизировать транзакцию с базой данных, чтобы гарантировать отсутствие дубликатов? Согласно документации, транзакции ActiveRecord применяются только для каждого подключения, что недостаточно (насколько я могу судить).
Транзакции в MySQL всегда связаны друг с другом, нет другого способа рассказать, что такое атомная операция.
Я думаю, что единственный способ сделать это - либо заблокировать всю таблицу, либо обеспечить целостность на уровне схемы.