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

MCB*_*MCB 7 ruby-on-rails optimistic-locking

我想我已经淘汰了一切,但我不确定我是否完全理解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.)
Run Code Online (Sandbox Code Playgroud)

我试过的事情:

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

self.changed在从错误中抢救并检索后进行检查["updated_at", "failed_view_attempts", "failed_view_at"]

MCB*_*MCB 4

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