美文网首页
2018-07-09

2018-07-09

作者: 护念 | 来源:发表于2018-07-09 21:01 被阅读0次

乐观锁 VS 悲观锁

1、锁是为了解决,并发(同时修改数据)的问题;
2、事务是为了保证数据的原子性(要么都成功要么都失败)这两者是不同的

乐观锁

对数据的修改持开放态度,默认为不会出现同时修改的情况,也可以说认为这种情况发生的概论很低。

适用场景:发生同时修改数据的情况很低的时候。
原理:向数据库中添加lock_version字段,当同时有两个人取同一笔数据,并对数据做修改保存时;第一个提交保存的人,会成功提交;第二提交的人,由于提交时,lock_version字段已经和读取时值不一致(rails 中 lock_version 每次修改会 +1)提交会失败。

c1 = Comment.first
c2 = Comment.first

c1.body = 'sda'
c1.save   # 成功

c2.body = 'safasdf'
c2.save  # 失败
# => ActiveRecord::StaleObjectError: Attempted to update a stale object: Comment.

PS: 这个lock_version字段由rails 自己保管哦。

悲观锁

对数据的修改持保守态度,在有人修改时,会锁住数据,只有等本次修改结束,其他人才可以再次修改。

account = Account.find(2)

# 用法一
Account.transaction do
  account.lock!               # 锁住
  account.balance += 100
  account.save
end

# 用法二
account.with_lock do
   account.balance += 100
   account.save
end

相关文章

网友评论

      本文标题:2018-07-09

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