首页 > 其他分享 >乐观锁和悲观锁

乐观锁和悲观锁

时间:2023-10-01 14:07:25浏览次数:34  
标签:版本号 乐观 修改 线程 悲观 数据


乐观锁:

概念:悲观想法,每次去拿数据的时候都会认为别人会进行修改,所以在每次拿数据的时候都会进行上锁。这样别人想要拿数据的时候就会被挡住,直至悲观锁被释放,悲观锁中的额共享资源每次都只能给一个线程使用,其他线程堵塞,直至用完后再将资源转让给其他线程。
效率:处理加锁解锁的机制会额外产生开销,还会增加产生死锁的机会。另外还会降低并行性,如果已经锁定至线程A,其他线程都需要等待该线程A处理完,方才可以进行处理。
锁:行锁、表锁、连锁(共享锁)、写锁(排他锁),以及使用syncronized实现的锁均为悲观锁。

乐观锁:

概念:乐观想法,每次拿数据都认为别人不会进行修改数据,所以每次拿数据时都不会上锁。但如果想要更新数据,则会在更新数据前检查读取至更新这段时间内别人是否有修改这个数据。若修改了,则重新读取,并再次尝试更新,循环上述步骤直至更新成功(当然也存在更新失败的线程放弃更新操作的),乐观锁适用于多读少操作的应用类型,提高吞吐量。
比较:相对于悲观锁,在对数据操作时,乐观锁不会对数据库进行加锁的机制,而是使用记录数据版本号活时间戳来实现,一版版本记录使用较多。乐观锁一版不会产生任何锁和死锁的。

使用场景:


乐观锁的注意点:

如果一个变量的值读取时是A,在准备修改的时候还是A,那么我们能够说明它没有被其他线程进行修改过么?
显然不能,有可能被多个线程进行修改,最后一个线程又被修改了回来。这个时候我们应该怎么做?根据时间戳和版本号进行判断,我们优选版本号,在每次操作时都将版本号+1,每次进行操作时根据值和版本号进行判断!


标签:版本号,乐观,修改,线程,悲观,数据
From: https://blog.51cto.com/u_15907536/7673839

相关文章

  • 【面试题精讲】Mysql如何实现乐观锁
    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址文章更新计划系列文章地址在MySQL中,可以通过使用乐观锁来实现并发控制,以避免数据冲突和并发更新问题。乐观锁是一种乐观的思想,它假设并发操作不会导致冲突,只......
  • 乐观锁和悲观锁问题
    【BAT面试题系列】面试官:你了解乐观锁和悲观锁吗? 乐观锁和悲观锁问题,是出现频率比较高的面试题。本文将由浅入深,逐步介绍它们的基本概念、实现方式(含实例)、适用场景,以及可能遇到的面试官追问,希望能够帮助你打动面试官。前言乐观锁和悲观锁问题,是出现频率比较高的面......
  • C# 乐观锁和悲观锁
    1.概要乐观锁(OptimisticLocking)乐观锁的核心思想是假设在大多数情况下,资源不会发生冲突,因此允许多个用户或线程同时读取和修改资源。只有在真正发生冲突的时候才会进行冲突解决。乐观锁的工作原理如下:版本标识或时间戳:在资源中引入一个版本标识(Version)或时间戳(Timestamp)字段......
  • mybatisplus中设置乐观锁,首先需要在表结构中添加一个字段表示乐观锁,之后再domain中对
    2023-09-10version字段表示乐观锁 在表结构中添加一个字段表示乐观锁packagecom.hh.domain;importcom.baomidou.mybatisplus.annotation.TableLogic;importcom.baomidou.mybatisplus.annotation.TableName;importcom.baomidou.mybatisplus.annotation.Version;impo......
  • 在代码中配置乐观锁插件和分页插件
    在代码中配置乐观锁插件和分页插件在代码中配置乐观锁插件和分页插件,您可以按照以下步骤进行操作:配置乐观锁插件:乐观锁插件是MyBatisPlus提供的功能之一,您可以在配置类中进行配置。假设您使用的是SpringBoot,可以创建一个配置类(如MyBatisConfig)并添加@Configuration注解,......
  • 乐观锁的配置与实现
    首先第一步:在数据表中添加version字段: 第二步:在实体类中添加对应字段:并加上@Version注解第三步:配置乐观锁拦截器实现锁机制对应的动态sql语句拼装: 第四步测试: ......
  • 悲观锁和乐观锁
    目录一概念1.1什么是并发控制1.2悲观锁1.3乐观锁1.4悲观锁乐观锁使用场景二MySQL实现悲观锁三django实现悲观锁乐观锁案例3.1django实现悲观锁3.2乐观锁普通版,秒杀-->库存还有,有的人就没成功3.3升级版一概念无论是悲观锁还是乐观锁,都是人们定义出来的概念,仅仅是一......
  • The database operation was expected to affect 1 row(s), but actually affected 0
    Thedatabaseoperationwasexpectedtoaffect1row(s),butactuallyaffected0row(s);解决乐观并发1.乐观并发EFCore实现乐观并发,假定并发冲突相对较少。与悲观方法(即先锁定数据,然后才继续修改数据)不同,乐观并发不需要锁定,而是安排数据修改在保存时失败(如果数据自......
  • django乐观锁、悲观锁商品秒杀简单demo
    悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读......
  • 关于乐观锁上锁成功的前提条件讨论
    在计算机编程领域,乐观锁(OptimisticLocking)是一种处理并发访问共享数据的策略,它的基本思想是先进行操作,然后在更新数据之前检查是否有其他并发操作修改了数据。如果没有冲突,操作可以成功执行;如果存在冲突,系统需要进行冲突处理,例如回滚操作、重新尝试或者通知用户。乐观锁的设计目......