我想我已经消除了一切,但我不确定我是否完全理解OL以确定。一般来说,假设你和我在团队中保持最新状态。我在一个房间并决定节省时间我会自己更新foo。所以我开始更新它。一分钟后,您有相同的想法,并登录编辑页面以更新它。如果我先完成会怎么样?如果你先完成会怎么样?在它失败的配置中,它如何区分某人编辑和某人阅读。如果我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"]
答案 0 :(得分:2)
需要将lock_version
列默认设置为零(0)。
答案 1 :(得分:0)
乐观锁定基于对象版本号。
阅读和对象不应该影响版本号。
如果您尝试更新某个对象,则比较此版本号(在sql中实际更新语句用于示例&#34;更新...其中版本= 1和...&#34;)并且增加了更新
如果在尝试更新时比较失败,则会出现陈旧对象错误。这意味着当您进行更改时,该对象已被其他人修改。
要解决此错误,您需要再次加载对象以获取实际版本,并可能手动合并更改(向用户显示有关它的一些信息,并让用户决定)。