锁机制主要用于解决并发的问题,一般来讲悲观锁用的多一点
乐观锁
允许同时对同一条数据,读取和编辑,但后更新的那一条会抛出异常
c1 = Comment.first
c2 = Comment.first
c1.body = '猜猜猜'
c1.save
c2.body = '滴滴滴'
c2.save
# => ActiveRecord::StaleObjectError: Attempted to update a stale object:
用法:只需要在表中添加一个
整数类型的 lock_version
字段,rails 就会在更新时,自动更新此字段的值(+1
)
原理:在更新数据时,rails会去判断数据库中当前lock_version 字段和取出时是否一致,一致则更新,不一致则抛出异常
悲观锁
1、不允许同时读取/编辑同一条数据,拿数据时,会给数据上锁。
2、只有等本次数据操作完成(锁打开),这条数据才能被再次读取/编辑
3、常与事务一起,避免死锁
用法一
# 对象不存在时
Balance.transation do
b = Balance.lock.first
b.income += 100
b.save
end
生成如下sql
begin
....sql语句 ..for update;
commit
用法二
# 对象已存在
b = Balance.first
b.with_lock do
b.income += 100
b.save
end
网友评论