要使用乐观锁的表需要有一个叫 lock_version 的栏,每次更新记录的时候, Active Record 会自动增加这个栏的值 ..
现在我想在 posts 表里使用乐观锁,先去创建一个 migration .. 名字是 AddLockVersionToPosts .. 在 posts 表里添加一个 lock_version 栏 .. 类型是 integer
rails generate migration AddLockVersionToPosts lock_version:integer
再运行一下 migration ..
rails db:migrate
登录到 rails 的控制台 .. 先去创建一条新的 Post 记录 ... title 是 haha,user_id 是 1
Post.create(title: 'haha', user_id: 1)
在我这里,刚刚创建的这条记录的 id 是 4,lock_version 是 0 ... 然后假设有两个人同时要更新这条记录 .. 先把它检索出来 ...
post_a = Post.find(4)
post_b = Post.find(4)
先更新一下 post_a 里的 title ... 重新设置一下它的值 .. 让它等于 heihei ..
然后用一下模型的 save 方法,保存一下修改 ..
post_a.save
更新成功 .. 然后再重新检索一下这条记录 ..
Post.find(4)
你会发现,它的 lock_verison 的值是 1 ,之前是 0 .. 更新了一次这条记录, lock_version 的值就会加上 1 ... 这样如果有其它的更新,使用的 lock_version 的值小于当前的 lock_version 的值,Active Record 就会抛出一个异常.. 不会执行更新的动作 ...
再去修改一下 post_b 的 title 的值 .. 让它等于 hehe ... 然后再用一下 post_b.save ... 这里会显示一个错误:
ActiveRecord::StaleObjectError: Attempted to update a stale object: Post.
重新再检索一下这条记录 ...
Post.find(4)
它现在的 title 会是 post_a 更新的那个值 ...