我想我已经消除了一切,但我不确定我对OL的了解是否足够肯定。一般来说,假设你和我是一个团队的成员,以保持最新的快感。我在一个房间里,决定节省时间,我会自己更新的。所以我开始更新它。一分钟后,您有了相同的想法,并登录到编辑页面来更新它。如果我先做完该怎么办?如果你先做完该怎么办?在配置失败的情况下,如何区分编辑人员和正在阅读的人。如果我catch
并重新加载以更新锁,那么我丢失了所有的更改,这是如何解决的?在这里,重做更新很简单,但它可能是一个更复杂的表单对象的一部分。
我的具体问题是在浏览器中加载了一个副本,然后忘记了它,然后在我的控制台中加载了一个副本(也是锁: 0?)。无法用陈旧的对象错误更新控制台中的一个。注意到浏览器的事了。关闭了我的控制台。试图重新加载我的浏览器,并得到陈旧的对象错误以及。下面是失败的代码:
=> 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"]
发布于 2016-09-18 19:15:19
需要将lock_version
列默认设置为零(0)。
发布于 2016-09-22 18:31:11
乐观锁定基于对象版本号。
读取和对象不应影响版本号。
如果您试图更新某个对象,则会比较此版本号(在sql中实际使用update语句,例如" update . version =1和.“),并在update时增加。
如果在尝试更新时比较失败,则会得到陈旧的对象错误。这意味着在进行更改时,对象是由其他人修改的。
要解决此错误,您需要再次加载对象以获得实际版本,并可能手动合并更改(例如,向用户提供有关它的一些信息,并让用户决定)。
https://stackoverflow.com/questions/39476642
复制相似问题