前言:
乐观锁和悲观锁,不是具体的一种锁,而是一种锁的概念,或者说是一种思想。
正如其名,乐观锁和悲观锁,可以对应到所谓的乐观主义和悲观主义。
一、什么是乐观锁?
乐观锁认为数据是不会被其他人修改的,
所以他秉承一个理念,就是在真正对数据进行修改时,再去校验数据真实性。
1.1 简单的乐观锁模型:
在数据上设置一个时间戳字段,随更新而变动
通过时间戳判断数据是否被修改过
在一个“事务”开始前,查询到一行记录,不上锁
修改记录时,再次查询数据时间戳,看是否与最开始的时间戳一致【比较和修改的原子性】
一致,则继续
不一致,则重试或停止
1.2 优势
减少了加锁释放锁的性能消耗
不会出现死锁
1.3 劣势
如果频繁发生数据冲突,业务回滚重试会浪费更多资源
1.4 总结
乐观锁适合在冲突不频繁的场景下使用,读多写少的场景。
二、什么是悲观锁?
如果说乐观锁是一个天真的孩童,悲观锁就是一位谨小慎微之人。
悲观锁认为,数据随时可能被其他人修改,为了避免冲突,在获取到数据后,立刻上锁,禁止其他人写数据、甚至于禁止读数据。
2.1 悲观锁示例
mysql 排他锁 共享锁
加锁后禁止其他事务修改数据
2.2 优势
冲突频繁的场景下,悲观锁通过阻塞进程,减少重试次数,相比乐观锁性能更好。
2.3 劣势
加锁和释放锁的性能消耗
加锁后并发时会出现阻塞
2.4 总结
适用于冲突频繁的场景,比如多写的业务。