并发读写中的乐观锁、悲观锁
2017-12-17 本文已影响48人
hjiangwen
问题:
一份u点被多次使用,原因是同时间对一个记录执行多个更新操作,会产生冲突。这就是并发控制问题。一般有2种后果:1. 丢失更新,2. 读取到旧数据。
有2种方式解决这个问题:
一、乐观锁
乐观锁允许多个用户访问同一个数据进行修改,假定发生数据冲突的可能性最小。它会在保存时判断这个数据是否已经被修改了,如果是则失败。
Rails中,如果一个model
有lock_version
字段,每次修改都会增加这个字段。如果一个记录的相同版本被修改了1次以上,那么第一次以后的修改会抛出StaleObjectError
异常。
二、悲观锁
悲观锁认为每次读取数据时,都会有其他进程在修改数据。所以每次读取数据时都会上锁,这样其他进程就被阻塞住,直到拿到锁。
Rails中,使用ActiveRecord::Locking::Pessimistic#with_lock
方法,来锁定某一行数据。
参考: