乐观锁 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
网友评论