Я пытаюсь реализовать Оптимистическую блокировку для состояния гонки.Для этого я добавил дополнительный столбец lock_version
в Продукте: модель через миграцию.
#Product: Model's new field:
# attribute_1
# lock_version :integer(4) default(0), not null
before_validation :method_1, :if => :recalculation_required_attribute
def method_1
####
####
if self.lock_version == Product.find(self.id).lock_version
attributes["lock_version"] += 1
attributes["updated_at"] = Time.now
Product.where(:id => self.id).update_all(attributes)
self.attributes = attributes
end
end
Модель продукта имеет attribute_1
.Если для attribute_1
требуется перерасчет, то вызовет before_validation: method_1
.
Я использую оптимистическую блокировку с использованием lock_version
.Тем не менее, update_all
не увеличит lock_version
и не сможет self.save!
, потому что будет вызывать before_validation: method1
в течение бесконечного времени.
Если я сделаю подобное, будет ли оптимистическая блокировка работать с использованием update_all?
attributes["lock_version"] = 1 +1
attributes["updated_at"] = Time.now
Product.where(:id => self.id).update_all(attributes)
Более подробную информацию вы можете получить по lock_version