2018-08-08-乐观锁 VS 悲观锁

2018-08-08  本文已影响0人  护念

锁机制主要用于解决并发的问题,一般来讲悲观锁用的多一点

乐观锁

允许同时对同一条数据,读取和编辑,但后更新的那一条会抛出异常

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
上一篇下一篇

猜你喜欢

热点阅读