【问题标题】:How to handle optimistic locking in case of updated_all?在updated_all的情况下如何处理乐观锁定?
【发布时间】:2018-09-30 18:50:04
【问题描述】:

我正在尝试实现竞争条件的乐观锁定。为此,我在 Product: Model through migration 中添加了一个额外的列 lock_version

产品:模型的新领域:

#  lock_version                       :integer(4)      default(0), not null

当我尝试save! 时,乐观锁定正在工作。记录、updated_at 和 lock_version 正在更新。

但是,在现有的源代码中,我们使用的是updated_all,它不会更新updated_atlock_version。所以乐观锁定不起作用。请建议,如何为updated_all实现乐观

Product.where(:id => self.id).update_all(attributes)
      self.attributes = attributes

【问题讨论】:

  • 您在尝试当前方法时是否收到任何错误消息?如果是这样,您可以发布错误日志吗?
  • 我认为您不想为此使用 update_all。 update_all 绕过所有回调,通常在您想要进行批量插入时使用。在这种情况下,您通过 id 查找单个资源,因此 find 使用标准 update 会更好
  • @Austio 你的意思是说我应该使用prod= Product.find(:id => self.id) prod.update(attributes)
  • 正确,您也不需要哈希火箭或指定 id Product.find(self.id).update(attributes) 还有其他事情您必须考虑,例如在找不到时进行处理。
  • @Austio 感谢您的回复,那么这将支持乐观锁定

标签: ruby-on-rails ruby ruby-on-rails-3 race-condition optimistic-locking


【解决方案1】:

我们可以简单地这样做。(以防不需要回调。)

Product.where(:id => self.id, lock_version: params[:lock_version]).update_all('price = 0, lock_version = lock_version + 1')

这将寻找与 lock_version 匹配并更新 lock_version 的记录。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多