获取陈旧对象错误。乐观锁定:它是如何工作的?
Getting Stale object error. Optimistic Locking: How does it work?
我想我已经消除了一切,但我不确定我是否完全理解 OL 以确保。一般来说,假设你和我在一个团队中,让 foo 保持最新状态。我在一个房间里,为了节省时间,我会自己更新 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.)
我尝试过的事情:
为了查看是否正在加载另一个实例,我在 after_initialize
回调中添加了 puts "CALLED !!!!"
,但它只打印了一次。
并检查 self.changed
从错误中解救并返回 ["updated_at", "failed_view_attempts", "failed_view_at"]
需要将 lock_version
列默认设置为零 (0)。
乐观锁定基于对象版本号。
阅读和对象应该不会影响版本号。
如果您尝试更新某个对象,则会比较此版本号(在 sql 中实际使用更新语句,例如 "update ... where version = 1 and ..." )并在更新时增加。
如果尝试更新时比较失败,您将收到陈旧对象错误。这意味着该对象在您进行更改时被其他人修改了。
要解决此错误,您需要再次加载对象以获得实际版本,并可能手动合并更改(例如向用户提供一些相关信息,让用户决定)。
我想我已经消除了一切,但我不确定我是否完全理解 OL 以确保。一般来说,假设你和我在一个团队中,让 foo 保持最新状态。我在一个房间里,为了节省时间,我会自己更新 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.)
我尝试过的事情:
为了查看是否正在加载另一个实例,我在 after_initialize
回调中添加了 puts "CALLED !!!!"
,但它只打印了一次。
并检查 self.changed
从错误中解救并返回 ["updated_at", "failed_view_attempts", "failed_view_at"]
需要将 lock_version
列默认设置为零 (0)。
乐观锁定基于对象版本号。
阅读和对象应该不会影响版本号。
如果您尝试更新某个对象,则会比较此版本号(在 sql 中实际使用更新语句,例如 "update ... where version = 1 and ..." )并在更新时增加。
如果尝试更新时比较失败,您将收到陈旧对象错误。这意味着该对象在您进行更改时被其他人修改了。
要解决此错误,您需要再次加载对象以获得实际版本,并可能手动合并更改(例如向用户提供一些相关信息,让用户决定)。