【发布时间】: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_at 和lock_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