很多时候我们提起并发问题,所担心的就是超卖和数据一致性等,如何解决这种问题也是众开发人员一直以来所思考的,目前首先提到的就是悲观锁与乐观锁!
首先需要了解的是,悲观锁与乐观锁其实不是Mysql的锁,和我们说的行锁表锁不是一个东西,而是两个概念
悲观锁:在并发中,出于悲观的想法,认为所有操作会相互影响数据,因此我们在需要操作时需要排队,每次只有1个请求能操作表,这个可以使用表锁来实现,因为是表锁,效率低!
乐观锁:在并发中,出于乐观想法,认为所有操作数据不会相互影响,所以我们不限制操作,直到要更新操作时.乐观锁一般使用版本对比来实现.例如:我们增加某个字段A,我们更新前获取一个A的值是V,更新时对比这个A的值是否依然是V,如果变化了,说明有其他人修改过,直接拒绝此次操作,返回给用户,让用户重试
- 方法1:在数据表中增加字段version,每次用户在需要更新时,先要拿到前一个版本的version,然后在更新时进行对比,如果两次version不一致,那么就拒绝此次操作,并返回给用户,提示用户再次尝试
- 方法2:在数据表中增加字段timestamp,依然是更新前获取timestamp的值,更新时进行对比,两次不一致,拒绝操作
注意:乐观锁中的操作需要具有原子性,必须处于同一个事务中
这是我的简单理解,有不对的地方,感谢指正!