Ruby:使用update_all可以进行乐观锁定吗?

时间:2018-10-04 11:44:13

标签: ruby ruby-on-rails-3 ruby-on-rails-4 activerecord locking

我正在尝试对比赛条件实施乐观锁定。为此,我在产品:通过迁移进行的模型中添加了额外的列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

上查看更多信息。

0 个答案:

没有答案