樂觀鎖 VS 悲觀鎖
1俄删、鎖是為了解決杈女,并發(fā)(同時修改數(shù)據(jù))的問題统捶;
2霉囚、事務是為了保證數(shù)據(jù)的原子性(要么都成功要么都失敗)這兩者是不同的
樂觀鎖
對數(shù)據(jù)的修改持開放態(tài)度墙懂,默認為不會出現(xiàn)同時修改的情況橡卤,也可以說認為這種情況發(fā)生的概論很低。
適用場景:發(fā)生同時修改數(shù)據(jù)的情況很低的時候损搬。
原理:向數(shù)據(jù)庫中添加lock_version
字段碧库,當同時有兩個人取同一筆數(shù)據(jù),并對數(shù)據(jù)做修改保存時巧勤;第一個提交保存的人嵌灰,會成功提交;第二提交的人颅悉,由于提交時沽瞭,lock_version
字段已經(jīng)和讀取時值不一致(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 自己保管哦剩瓶。
悲觀鎖
對數(shù)據(jù)的修改持保守態(tài)度驹溃,在有人修改時,會鎖住數(shù)據(jù)儒搭,只有等本次修改結(jié)束吠架,其他人才可以再次修改。
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