什么是乐观锁
Optimistic
锁定允许多个用户访问同一记录进行编辑,并假设数据冲突最少。它通过检查自打开记录以来是否有其他进程对记录进行更改来实现此目的,如果发生这种情况,则会抛出 ActiveRecord::StaleObjectError
异常,并且会忽略更新。
查看 ActiveRecord::Locking::Pessimistic
了解替代方案。
用法
如果存在 lock_version
字段,则 Active Record 支持乐观锁。对记录的每次更新都会递增 lock_version
列,并且锁定机制确保两次实例化的记录将让最后保存的记录引发 StaleObjectError
(如果第一个记录也已更新)。示例
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
Optimistic
锁定还会在销毁对象时检查过时数据。示例
p1 = Person.find(1)
p2 = Person.find(1)
p1.first_name = "Michael"
p1.save
p2.destroy # Raises an ActiveRecord::StaleObjectError
然后,您负责通过捕获异常并回滚、合并或以其他方式应用解决冲突所需的业务逻辑来处理冲突。
此锁定机制将在单个 Ruby 进程内运行。为了使其在所有 Web 请求中都能正常工作,建议的方法是将 lock_version
作为隐藏字段添加到您的表单。
可以通过设置 ActiveRecord::Base.lock_optimistically = false
来关闭此行为。要覆盖 lock_version
列的名称,请设置 locking_column
类属性
class Person < ActiveRecord::Base
self.locking_column = :lock_person
end
命名空间