Ruby: Будет ли работать оптимистическая блокировка с использованием update_all? - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь реализовать Оптимистическую блокировку для состояния гонки.Для этого я добавил дополнительный столбец 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

...