美文网首页
2018-08-08-乐观锁 VS 悲观锁

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

作者: 护念 | 来源:发表于2018-08-08 21:55 被阅读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
    

    相关文章

      网友评论

          本文标题:2018-08-08-乐观锁 VS 悲观锁

          本文链接:https://www.haomeiwen.com/subject/sfhfbftx.html