问题描述
我尝试像here一样阅读和练习并执行下面的示例
p1 = Person.find(1)
p2 = Person.find(1)
p1.first_name = "Michael"
p1.save
p2.first_name = "should fail"
p2.save # Raises an ActiveRecord::StaleObjectError
我在 rails console
上做了,但我没有看到任何 ActiveRecord::StaleObjectError
我看到它仍然有效并且 p2.save
成功完成。谁能告诉我为什么?
解决方法
为了让 Ruby On Rails 使用乐观锁定,您需要先向数据库表中添加一个 lock_version
列(整数类型)。
在每次更新时,Rails 都会将此版本增加 1。保存时,仅当数据库中的当前值与最初读取的值相同时才执行更新。
在您的示例中,p1.save
会将数据库中的列值增加 1。然而,p2
对象仍然存储了先前的较低值。在尝试保存 p2
对象时,Rails 会检测到 lock_version
已更新并引发 ActiveRecord::StaleObjectError
。