乐观锁定允许多个用户访问同一记录进行编辑,并假定与数据的冲突最少。它通过检查自打开记录以来是否有其他进程对记录进行了更改来执行此操作。一ActiveRecord::StaleObjectError,如果已发生异常被抛出,并且更新被忽略。
乐观锁柱
为了使用乐观锁定,表需要有一个称为lock_version整数类型的列。每次更新记录时,活动记录都会增加该lock_version列。如果在lock_version字段中提出的更新请求的值比lock_version数据库中当前列中的值小,则更新请求将失败,并带有ActiveRecord::StaleObjectError。例:
c1 = Client.find(1)c2 = Client.find(1) c1.first_name = "Michael"c1.save c2.name = "should fail"c2.save # Raises an ActiveRecord::StaleObjectError
然后,您负责通过抢救异常并回滚,合并或以其他方式应用解决冲突所需的业务逻辑来处理冲突。
可以通过设置关闭此行为ActiveRecord::Base.lock_optimistically = false。
要覆盖lock_version列的名称,请ActiveRecord::Base提供一个名为的类属性locking_column:
class Client < ApplicationRecord self.locking_column = :lock_client_columnend