乐观锁与悲观锁

  • 一、什么是乐观锁(Optimistic Locking)?
  • 二、什么是悲观锁(Pessimistic Lock)?
    • 悲观锁主要分为共享锁和排他锁
    • 注意
  • 三、并发控制

一、什么是乐观锁(Optimistic Locking)?

  乐观锁(Optimistic Lock)顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
  乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁适用于读多写少的场景,这样可以提高程序的吞吐量。
  乐观锁采取了更加宽松的加锁机制。也是为了避免数据库幻读、业务处理时间过长等原因引起数据处理错误的一种机制,但乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性。乐观锁的实现:

  1.CAS 实现:Java 中java.util.concurrent.atomic包下面的原子变量使用了乐观锁的一种 CAS 实现方式。
  2.版本号控制:一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会 +1。当线程 A 要更新数据时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值与当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。
  注意:乐观并发控制导致事务之间的数据竞争(data race)的概率是非常小的,因此可以尽可能地进行下去,直到提交的时候才去锁定,最后不会产生任何锁与死锁。

二、什么是悲观锁(Pessimistic Lock)?

  悲观锁(Pessimistic Lock)顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  同时也可以这样理解:当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制【Pessimistic Concurrency Control,缩写“PCC”,又名“悲观锁”】。
  悲观锁,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
  而为什么叫做悲观锁,是因为这是一种对数据的修改持有悲观态度的并发控制方式。总是假设最坏的情况,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。悲观锁的实现:

  1.传统的关系型数据库使用这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁。
  2.Java 里面的同步 synchronized 关键字的实现。

悲观锁主要分为共享锁和排他锁

  • 共享锁【shared locks】又称为读锁,简称 S 锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
  • 排他锁【exclusive locks】又称为写锁,简称 X 锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁。获取排他锁的事务可以对数据行读取和修改。

注意

  悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

三、并发控制

  当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。
  没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。

  常说的并发控制,一般都和数据库管理系统(DBMS)有关。在 DBMS 中并发控制的任务,是确保多个事务同时增删改查同一数据时,不破坏事务的隔离性、一致性和数据库的统一性。

实现并发控制的主要手段又主要分为乐观并发控制悲观并发控制两种。
  而我们所知道的悲观锁还是乐观锁,都是人们定义出来的概念,可以认为它是一种构建的思想。其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念,像 hibernate、tair、memcache 等都有类似的概念。所以,不应该拿乐观锁、悲观锁和其他的数据库锁等进行对比。乐观锁比较适用于读多写少的情况(多读场景),悲观锁比较适用于写多读少的情况(多写场景)。

浅谈面试中的乐观锁与悲观锁相关推荐

  1. 浅谈面试中常提到的乐观锁与悲观锁

    首先来看一下什么是锁? 在并发环境下,会出现多个线程对同一个资源进行争抢的情况,假设A线程对资源正在进行修改,此时B线程此时又对资源进行了修改,这就可能会导致数据不一致的问题.为了解决这个问题,很多编 ...

  2. 浅谈面试中常考的两种经典布局——圣杯与双飞翼

    圣杯和双飞翼布局介绍 最近正好碰到了写这种布局,一直没有总结过正好借这次机会总结一波,同时加强一下自己的理解. 博客链接:http://www.xluos.com/index.ph... 圣杯布局和双 ...

  3. 浅谈面试中常考的两种经典布局——圣杯与双飞翼 1

    2019独角兽企业重金招聘Python工程师标准>>> 圣杯和双飞翼布局介绍 最近正好碰到了写这种布局,一直没有总结过正好借这次机会总结一波,同时加强一下自己的理解. 圣杯布局和双飞 ...

  4. python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题

    CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...

  5. 浅谈Java中15种锁的分析比较

    作者:站长,来自:搜云库技术团队 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类,介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享 ...

  6. mysql共享锁使用方法_浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景...

    Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |-- ...

  7. 浅谈Java中的各种锁

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级 ...

  8. mysql锁的应用场景_浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |-- ...

  9. 浅谈实现数据库乐观锁和悲观锁

    目录 数据库乐观锁 适用场景 定义 实现方式 优点与缺点分析 优点 缺点 案例 数据库悲观锁 适用场景 定义 实现方式 悲观锁优缺点分析 优点 缺点 在单实例JVM中,常见的处理并发问题的方法有很多, ...

最新文章

  1. heartbeat+drbd+mysql构建mysql高可用群集
  2. mysql启动失败LSB_MySQL数据库服务启动失败
  3. 你不知道的javascript(上卷)----读书笔记
  4. 机器学习速成课程 | 练习 | Google Development——编程练习:逻辑回归
  5. 基于Python+Django的在线习题考试测试管理系统
  6. 进阶08 Collections实现类、Comparator比较器接口
  7. M3 Build6801 Discovery support Virtual Hard Disks
  8. POJ 1220 高精度进制转换
  9. S7-200SMART编程软件在符号绝对模式下变量符号名显示不全的解决办法
  10. 02、单线通讯—SIF通讯协议(一线通)案例一
  11. 字节跳动李航博士入选2019 ACL Fellow,成为第五位入选华人学者
  12. 一台计算机连接两个投影,一台电脑两个投影仪要如何连接
  13. 工程经济作业1答案_2018年电大《工程经济与管理》阶段作业1及答案(网上作业).doc...
  14. 中基鸿业投资理财好习惯
  15. [C语言错误]expected declaration or statement at end of input)
  16. 百度竞价托管一月多少钱
  17. 杂志风城市夜景PPT模板
  18. 沉痛悼念张孝祥老师逝世
  19. 【scratch】class_1_界面介绍
  20. 按年份、季度、月份、日期查询SQL语句

热门文章

  1. 智能安卓电视USB声卡解码器音量限制,只能同轴数字音频输出+遥控音量
  2. 用ANSYS画矩形_基于ANSYS的压力自动加载
  3. 【JZOJ5410】【NOIP2017提高A组集训10.22】小型耀斑
  4. 如何把pdf转成图片?
  5. 【联邦学习+区块链】《联邦学习vs区块链:谁是“可信媒介”技术领域最强王者?》疑问解答
  6. Vue 简易待办事项表
  7. 图像的傅里叶变换和逆变换C++版
  8. listener不能交给spring进行管理,需要自己new,不能注入其他对象,不能实现数据库操作
  9. 属于自己的“携程旅行”
  10. 10分钟完成模型开发!合合信息智能文字识别服务平台亮相1024程序员节