乐观锁

0
视频
0
完成
0%
进度
0
分钟
0
完成
0%
进度

要使用乐观锁的表需要有一个叫 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 更新的那个值 ...

乐观锁《 Rails:查询接口 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点