модуль ActiveRecord::Locking::Optimistic
Что такое Оптимистическая блокировка
Оптимистическая блокировка позволяет множественным пользователям получать доступ к одной и той же записи для редактирования и предполагает минимальное количество конфликтов с данными. Она достигает этого, проверяя, внёс ли другой процесс изменения в запись с момента её открытия. Бросается исключение ActiveRecord::StaleObjectError , если это произошло, и обновление игнорируется.
Посмотрите ActiveRecord::Locking::Pessimistic для альтернативы.
Использование
Активные записи поддерживают оптимистическую блокировку, если поле 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 a ActiveRecord::StaleObjectError
Оптимистическая блокировка также будет проверять устаревшие данные при удалении объектов. Пример:
p1 = Person.find(1) p2 = Person.find(1) p1.first_name = "Michael" p1.save p2.destroy # Raises a 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–2016 David Heinemeier Hansson
Licensed under the MIT License.