首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取陈旧的对象错误。乐观锁定:它是如何工作的?

获取陈旧的对象错误。乐观锁定:它是如何工作的?
EN

Stack Overflow用户
提问于 2016-09-13 18:21:32
回答 2查看 1.8K关注 0票数 7

我想我已经消除了一切,但我不确定我对OL的了解是否足够肯定。一般来说,假设你和我是一个团队的成员,以保持最新的快感。我在一个房间里,决定节省时间,我会自己更新的。所以我开始更新它。一分钟后,您有了相同的想法,并登录到编辑页面来更新它。如果我先做完该怎么办?如果你先做完该怎么办?在配置失败的情况下,如何区分编辑人员和正在阅读的人。如果我catch并重新加载以更新锁,那么我丢失了所有的更改,这是如何解决的?在这里,重做更新很简单,但它可能是一个更复杂的表单对象的一部分。

我的具体问题是在浏览器中加载了一个副本,然后忘记了它,然后在我的控制台中加载了一个副本(也是锁: 0?)。无法用陈旧的对象错误更新控制台中的一个。注意到浏览器的事了。关闭了我的控制台。试图重新加载我的浏览器,并得到陈旧的对象错误以及。下面是失败的代码:

代码语言:javascript
运行
复制
=>  7:       self.update_attributes({
    8:         failed_view_attempts: self.failed_view_attempts += 1,
    9:         failed_view_at: Time.now
   10:       })
   11:     end
(byebug) self
#<Product id: 12... lock_version: 0>

#=> ActiveRecord::StaleObjectError (Attempted to update a stale object: Product.)

我尝试过的事情:

为了查看是否加载了另一个实例,我在一个puts "CALLED !!!!"回调中添加了after_initialize,但它只打印了一次。

从错误中恢复后检查self.changed并返回["updated_at", "failed_view_attempts", "failed_view_at"]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-18 19:15:19

需要将lock_version列默认设置为零(0)。

票数 4
EN

Stack Overflow用户

发布于 2016-09-22 18:31:11

乐观锁定基于对象版本号。

读取和对象不应影响版本号。

如果您试图更新某个对象,则会比较此版本号(在sql中实际使用update语句,例如" update . version =1和.“),并在update时增加。

如果在尝试更新时比较失败,则会得到陈旧的对象错误。这意味着在进行更改时,对象是由其他人修改的。

要解决此错误,您需要再次加载对象以获得实际版本,并可能手动合并更改(例如,向用户提供有关它的一些信息,并让用户决定)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39476642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档