Предотвращение дублирования вставок / обновлений базы данных в нашем приложении Rails от одновременных транзакций - PullRequest
3 голосов
/ 04 января 2012

Поскольку наше приложение Rails имеет дело с повышением активности пользователей и нагрузки, мы начинаем видеть некоторые проблемы с одновременными транзакциями.Мы использовали JavaScript для отключения / удаления кнопок после нажатия, и это работает по большей части, но не является идеальным решением.Короче говоря, пользователи выполняют действие несколько раз подряд.Поскольку действие приводит к вставке строки в БД, мы не можем просто заблокировать одну строку в таблице.Учитывая высокий уровень активности на затронутых моделях, я не могу использовать обычные механизмы блокировки (http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update), которые вы использовали бы для обновления.

Этот вопрос ( Запрет одновременной работы)Транзакции в веб-приложении ) решают аналогичную проблему, но для обеспечения решения используется блокировка файлов (flock), поэтому это не будет работать с несколькими серверами приложений, как у нас.Мы могли бы сделать что-то подобное, я полагаю, с Redis или другим хранилищем данных, которое доступно для всех наших серверов приложений, но я не знаю, действительно ли это решит проблему полностью.

Каков наилучший способпредотвратить повторяющиеся вставки базы данных из одновременно выполняемых транзакций?

1 Ответ

4 голосов
/ 04 января 2012

Попробуйте добавить уникальный индекс в таблицу, где у вас возникла проблема. Это не помешает системе попытаться вставить дубликаты данных, но предотвратит их сохранение в базе данных. Вам просто нужно обращаться со вставкой, когда она выходит из строя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...