在 ruby​​ on rails 中锁定乐观

问题描述

我尝试像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