在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
0条评论 顺序楼层
请先登录再回复