В нашем приложении rails есть модель скажем Person
, а соответствующая таблица в базе данных mysql содержит около миллиона записей. В нашем контроллере есть метод update_status
для определенного атрибута status
. Мы получаем много HTTP-запросов на обновление этой модели. Это очень транзакционный характер, иногда мы получаем несколько обновлений определенной записи в течение одной секунды. Мы замечаем некоторые таймауты mysql из журналов.
Моя теория состоит в том, что это привело к тупику mysql из-за того, что в течение секунды происходит много обновлений для конкретной записи. В качестве разрешения я планирую использовать with_lock при обновлении, как показано ниже:
def update_status
@person_object.with_lock do
@person.update_attribute(:status, params[:status])
end
render response
end
Раньше у нас не было блокировки, и сейчас я представляю эту with_lock
для решения этой проблемы. Какое влияние это окажет на производительность, учитывая, что трафик очень высок? Хотя я знаю, что with_lock
делает row-level locking
, я не уверен, должен ли я помнить о любом другом влиянии, которое может вызвать это изменение. Даже если это не вызвано deadlock
, рекомендуется использовать такие блокировки для таких часто обновляемых методов / столбцов. Ищете ваши входы. Спасибо.