并发读写中的乐观锁、悲观锁

2017-12-17  本文已影响48人  hjiangwen

问题:

一份u点被多次使用,原因是同时间对一个记录执行多个更新操作,会产生冲突。这就是并发控制问题。一般有2种后果:1. 丢失更新,2. 读取到旧数据。

有2种方式解决这个问题:

一、乐观锁

乐观锁允许多个用户访问同一个数据进行修改,假定发生数据冲突的可能性最小。它会在保存时判断这个数据是否已经被修改了,如果是则失败。
Rails中,如果一个modellock_version字段,每次修改都会增加这个字段。如果一个记录的相同版本被修改了1次以上,那么第一次以后的修改会抛出StaleObjectError异常。

二、悲观锁

悲观锁认为每次读取数据时,都会有其他进程在修改数据。所以每次读取数据时都会上锁,这样其他进程就被阻塞住,直到拿到锁。
Rails中,使用ActiveRecord::Locking::Pessimistic#with_lock方法,来锁定某一行数据。

参考:

  1. https://ruby-china.org/topics/28963
  2. http://www.10tiao.com/html/591/201610/2247483863/1.html
上一篇下一篇

猜你喜欢

热点阅读