乐观锁与悲观锁

132 阅读2分钟

前言:

乐观锁和悲观锁,不是具体的一种锁,而是一种锁的概念,或者说是一种思想。

正如其名,乐观锁和悲观锁,可以对应到所谓的乐观主义和悲观主义。

一、什么是乐观锁?

乐观锁认为数据是不会被其他人修改的,

所以他秉承一个理念,就是在真正对数据进行修改时,再去校验数据真实性。

1.1 简单的乐观锁模型:

在数据上设置一个时间戳字段,随更新而变动

通过时间戳判断数据是否被修改过

在一个“事务”开始前,查询到一行记录,不上锁

修改记录时,再次查询数据时间戳,看是否与最开始的时间戳一致【比较和修改的原子性】

一致,则继续

不一致,则重试或停止

1.2 优势

减少了加锁释放锁的性能消耗

不会出现死锁

1.3 劣势

如果频繁发生数据冲突,业务回滚重试会浪费更多资源

1.4 总结

乐观锁适合在冲突不频繁的场景下使用,读多写少的场景。

二、什么是悲观锁?

如果说乐观锁是一个天真的孩童,悲观锁就是一位谨小慎微之人。

悲观锁认为,数据随时可能被其他人修改,为了避免冲突,在获取到数据后,立刻上锁,禁止其他人写数据、甚至于禁止读数据。

2.1 悲观锁示例

mysql 排他锁 共享锁

加锁后禁止其他事务修改数据

2.2 优势

冲突频繁的场景下,悲观锁通过阻塞进程,减少重试次数,相比乐观锁性能更好。

2.3 劣势

加锁和释放锁的性能消耗

加锁后并发时会出现阻塞

2.4 总结

适用于冲突频繁的场景,比如多写的业务。