4月更文d17n17-悲观锁与乐观锁

87 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

悲观锁与乐观锁

前文

本文主要的内容主要是针对数据库操作时的乐观锁与悲观锁两种方式展开。前文借助利用乐观锁与悲观锁实现幂等性,曾对于二者进行过简要的概述。本文主要从个人理解的角度对悲观锁与乐观锁的相关知识进行一下总结,难免其中存在不足之处,还请见谅。

悲观锁

对于悲观锁来说,这是一种具有强烈的独占性和排他性的锁。数据库中的行锁和表锁都是一种典型的悲观锁。当数据库中的数据被行锁表锁锁住时,其他的数据库语句无法对被锁住的数据进行更新处理。只有等到当前的锁释放后,后续的操作才可以执行。常见的操作是采用select ... for update进行悲观锁添加,该操作可以锁住所有满足条件的数据避免其他请求或线程进行修改,直到事务提交后才能继续调用。而在java语言中,同样也有对于悲观锁的使用。很常用的线程锁synchronized关键字,当升级为重量级锁时,即为一种典型的悲观锁。该锁可以保证其他线程在操作结束前无法对共享资源进行操作。

乐观锁

悲观锁很明显是一种很重的锁,自然也会带来一定的效率问题。与之对应的是乐观锁。乐观锁实际上并非是一把锁,可以更多的认为是一种约束思想。乐观锁的核心在于通过对版本号的操作,实现数据层面的约束效果。当数据进行更新时,首先将当前携带的更新版本与数据库中的目标版本进行比较,如果发现数据库中版本未被修改过,则正常进行更新。否则也就是数据已被调整,该语句失效。乐观锁顾名思义会盲目的认为数据处于未被修改状态。该锁的效率相对于悲观锁会有明显的提升。java中同样有基于乐观锁的cas锁,通过比较交换的思路来对数据进行锁定。轻量级锁是乐观锁的一个主要应用场景。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。