Пессимистическая блокировка with_lock в Rails - PullRequest
1 голос
/ 08 ноября 2019

В нашем приложении 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, рекомендуется использовать такие блокировки для таких часто обновляемых методов / столбцов. Ищете ваши входы. Спасибо.

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