在Rails中也集成了乐观锁的功能,由无所不能的ActiveRecord实现。使用的方式及其简单,只需要在对应的model中加入一个lock_version字段:
class CreateOrders < ActiveRecord::Migration[5.1]
def change
create_table :orders do |t|
t.integer :lock_version, default: 0
t.string :name
t.integer :leave_count,default: 0
end
end
end
在model数据更新的时候就会自动检测数据版本,只有持有最新的 lock_version 数据的更新操作能成功。
# p1 p2 持有同样的数据版本
p1 = Order.find(1)
p2 = Order.find(1)
p1.name = "zhangsan"
p1.save # 成功, lock_version字段值会自动增加
p2.name = "cuihua"
p2.save # Raises an ActiveRecord::StaleObjectError
当持有旧版本的更新操作会得到一个ActiveRecord::StaleObjectError异常。具体可以查看官方文档。
解决方案:
p1.with_lock do
p1.name = "zhangsan"
p1.save
end