модуль 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.