Spec-Zone.ru › Ruby on Rails 8.1

module ActiveRecord::Locking::Optimistic

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

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

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

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–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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