Spec-Zone.ru › Ruby on Rails 6.0

модуль ActiveRecord::Locking::Optimistic

Что такое Оптимистическое блокирование

Оптимистическое блокирование позволяет нескольким пользователям получить доступ к одной и той же записи для редактирования и предполагает минимальное количество конфликтов с данными. Оно делает это, проверяя, не внес ли другой процесс изменения в запись с момента её открытия; если это произошло, выбрасывается исключение ActiveRecord::StaleObjectError, и обновление игнорируется.

Посмотрите на ActiveRecord::Locking::Pessimistic для альтернативного варианта.

Использование

Active Record поддерживает оптимистическое блокирование, если поле lock_version присутствует. Каждое обновление записи увеличивает столбец lock_version, и средства блокирования гарантируют, что записи, созданные дважды, позволят последней сохранённой записи вызвать исключение StaleObjectError, если первая также была обновлена. Пример:

p1 = Person.find(1)
p2 = Person.find(1)

p1.first_name = "Michael"
p1.save

p2.first_name = "should fail"
p2.save # Raises an ActiveRecord::StaleObjectError

Оптимистическое блокирование также проверяет наличие устаревших данных при удалении объектов. Пример:

p1 = Person.find(1)
p2 = Person.find(1)

p1.first_name = "Michael"
p1.save

p2.destroy # Raises an ActiveRecord::StaleObjectError

Вы несёте ответственность за обработку конфликта путём перехвата исключения и либо отката, либо слияния, либо иным образом применяете бизнес-логику, необходимую для разрешения конфликта.

Данный механизм блокирования будет работать внутри одного процесса Ruby. Для того, чтобы он работал со всеми веб-запросами, рекомендуется добавить lock_version в качестве скрытого поля в вашу форму.

Это поведение можно отключить, установив ActiveRecord::Base.lock_optimistically = false. Чтобы переопределить имя столбца lock_version, установите атрибут класса locking_column:

class Person < ActiveRecord::Base
  self.locking_column = :lock_person
end

© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API