对乐观锁和悲观锁的理解

78 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

背景

  1. 凡是出现并发问题,第一个想到的就是锁。

  2. 什么是乐观锁?使用的场景是什么?

  3. 什么是悲观锁?使用的场景是什么?

过程

  • 乐观锁 - 整个过程是没有上锁的

    系统是一定需要支持事务的。在这样的条件下,对并发控制来说,使用乐观锁(乐观并发控制)。在读多写少的场景中,乐观锁是非常有效率的。多个线程可以同时读同样的数据。在这整个过程,会持续检测冲突,并防止多个线程尝试修改这同样的数据。整个过程中,只有一个线程会更新成功,其他会更新失败。更新失败的,会进行事务回滚,并且抛出异常。不上锁,性能高。

  • 乐观锁理解的演示例子 Mysql在乐观锁层面解决并发问题

  • 悲观锁 - 当拿到数据的一瞬间就上锁了的

    跟乐观锁的差异就是:整个过程是上锁了的,因此性能低。表现就是不会抛出异常,因为整个过程就是阻塞,等待上一个线程释放锁,自己拿到锁,然后执行逻辑即可,直到不满足业务逻辑的时候,可能要抛出异常或者给出友好提示。 场景:写多读少,或者写和读一样频繁。

  • 悲观锁理解的演示例子Mysql的select for update理解

小结

  1. 加上对乐观锁和悲观锁的理解。

  2. 熟练使用这样的原理来解决并发问题。

  3. 理解:在读多写少的场景下,使用乐观锁。在写多读少的场景下,使用悲观锁。