問(wèn)題:
一份u點(diǎn)被多次使用,原因是同時(shí)間對(duì)一個(gè)記錄執(zhí)行多個(gè)更新操作竖瘾,會(huì)產(chǎn)生沖突沟突。這就是并發(fā)控制問(wèn)題。一般有2種后果:1. 丟失更新准浴,2. 讀取到舊數(shù)據(jù)事扭。
有2種方式解決這個(gè)問(wèn)題:
一、樂(lè)觀鎖
樂(lè)觀鎖允許多個(gè)用戶訪問(wèn)同一個(gè)數(shù)據(jù)進(jìn)行修改乐横,假定發(fā)生數(shù)據(jù)沖突的可能性最小求橄。它會(huì)在保存時(shí)判斷這個(gè)數(shù)據(jù)是否已經(jīng)被修改了,如果是則失敗葡公。
Rails中罐农,如果一個(gè)model
有lock_version
字段,每次修改都會(huì)增加這個(gè)字段催什。如果一個(gè)記錄的相同版本被修改了1次以上涵亏,那么第一次以后的修改會(huì)拋出StaleObjectError
異常。
二、悲觀鎖
悲觀鎖認(rèn)為每次讀取數(shù)據(jù)時(shí)气筋,都會(huì)有其他進(jìn)程在修改數(shù)據(jù)拆内。所以每次讀取數(shù)據(jù)時(shí)都會(huì)上鎖,這樣其他進(jìn)程就被阻塞住宠默,直到拿到鎖麸恍。
Rails中,使用ActiveRecord::Locking::Pessimistic#with_lock
方法搀矫,來(lái)鎖定某一行數(shù)據(jù)抹沪。
參考: