首页 > 编程语言 >什么是计算机编程领域的乐观锁和悲观锁

什么是计算机编程领域的乐观锁和悲观锁

时间:2023-08-14 16:33:49浏览次数:27  
标签:计算机 版本号 编程 用户 乐观 并发 悲观 数据

乐观锁和悲观锁是计算机编程领域中用于处理并发访问数据的两种不同策略。它们的主要目标是在多个线程或进程同时访问共享数据时,保证数据的一致性和完整性,避免出现竞态条件(Race Condition)。在不同的情景下,选择合适的锁策略可以提高程序的性能和可靠性。

1. 悲观锁(Pessimistic Locking):

悲观锁假定在操作数据时,会发生竞态条件,因此默认情况下将数据锁定,防止其他线程或进程同时修改数据。这种策略认为并发冲突是常态,因此在数据访问时会加上锁,以确保每次只有一个线程可以访问数据,从而避免并发问题。

示例
假设有一个银行账户,多个用户可以同时访问并进行取款操作。使用悲观锁,当一个用户开始取款时,系统会将账户数据加锁,直到该用户完成取款操作。其他用户必须等待锁释放,才能进行操作。

在数据库中,悲观锁可以使用SELECT ... FOR UPDATE语句来实现。当一个事务执行该语句时,它会锁定选定的行,直到事务完成。

2. 乐观锁(Optimistic Locking):

乐观锁的思想是,大多数情况下,数据的并发冲突是很少发生的,因此不采取过多的锁定,而是在更新数据之前先进行一次检查,确认数据是否被其他线程修改过。如果没有被修改,就进行更新操作,否则,重新尝试或者进行冲突处理。

示例
考虑一个在线购物网站,多个用户可以同时购买同一商品。使用乐观锁,每个商品记录会有一个版本号。当用户要购买商品时,系统会读取商品的版本号,然后用户提交订单时,系统会再次检查版本号,如果版本号一致,就执行购买操作,然后将版本号递增;如果版本号不一致,意味着在用户浏览商品和购买之间有其他用户修改了数据,那么系统会提示用户重新确认购买操作。

在数据库中,乐观锁可以通过添加一个版本号字段来实现。在更新数据时,检查当前版本号是否与预期版本号匹配,如果匹配则执行更新,否则表示数据已被修改。

选择合适的锁策略:

选择悲观锁还是乐观锁取决于具体的应用场景和并发访问模式。

  • 悲观锁适用于:并发冲突非常频繁,数据修改操作复杂,竞争较激烈的情况。然而,悲观锁可能导致系统性能下降,因为它会频繁地阻塞等待锁。

  • 乐观锁适用于:并发冲突相对较少,大部分情况下数据是安全的,只有极少数情况下才会出现竞态条件的情况。乐观锁不会引入太多的锁开销,但需要在冲突处理方面考虑更多的逻辑。

在实际应用中,可以根据业务需求和性能要求选择合适的锁策略,甚至可以在同一个系统中同时使用悲观锁和乐观锁,针对不同的数据进行不同的处理。

总结:

乐观锁和悲观锁是处理并发访问数据的两种主要策略。悲观锁假设并发冲突是常态,会在数据访问时加锁,以避免竞态条件。乐观锁则假设并发冲突较少,先进行操作并在更新前检查数据是否被修改过。在实际应用中,根据并发访问模式和性能需求,选择合适的锁策略是确保数据一致性和程序可靠性的关键。

标签:计算机,版本号,编程,用户,乐观,并发,悲观,数据
From: https://www.cnblogs.com/sap-jerry/p/17629055.html

相关文章

  • 什么是软件设计领域的 stateless 编程范式
    在软件设计领域,stateless编程范式是一种设计模式,其中程序或对象在其生命周期中不保存任何状态。换句话说,一个stateless程序或对象的行为仅仅取决于它的输入,而不依赖于任何先前的交互或数据。让我们来详细了解一下stateless编程范式。在大多数情况下,当我们谈论stateless,我们......
  • 7.0 Python 面向对象编程
    python是一种面向对象的编程语言,面向对象编程(Object-OrientedProgramming,OOP)是一种编程思想,其核心概念是“对象”。对象是指一个具有特定属性和行为的实体,而面向对象编程就是通过对这些实体进行抽象、分类、封装和继承等操作,来实现程序的结构和逻辑。在python中,我们可以通过定义类......
  • 编程题算法总结
    求最大公约数最小公倍数最大公约数辗转相除法大的a除小的b,得到余数如果是0,那么b就是最大公约数,否则就取余数做那个小的,本来的b就成了大的继续操作。intn,m;//辗转相除法,ab最大公约数=ab余数和b的最大公约数intyu,a,b;a=n>m?n:m;b=n>m?m:n......
  • 用于日常编程问题的 10 个 Python 代码片段
    Python已成为最受欢迎的编程语言之一,由于其灵活性、用户友好性和广泛的库。无论您是初学者还是有准备的开发人员,拥有一组方便的代码部分都可以为您节省大量时间和精力。在本文中,我们将深入研究十个可用于解决日常编程挑战的Python代码片段。我们将指导您完成每个片段,以简单的......
  • 使用Python做笔试编程题的注意事项
    上研究生这一两年一直在用Python,习惯了Python的库函数。由于Java语法严格又比较复杂,容易扰乱算法思路,并且太久没用以前擅长的C++,最近笔试一直首选Python。Python在笔试编程题中具有简洁易读、易于操作和大量的库支持的优点。然而,需要注意Python的执行效率,否则只要题目卡边界和时间......
  • Java入门学习——变量里的数据在计算机中的存储原理
    变量里的数据在计算机中的存储原理一、二进制只有0、1,按照逢2进1的方式表示数据:十进制转二进制的算法除二取余法。  结果:6的二进制是110  结果:13的二进制是1101二、计算机中表示数据的最小单元计算机中表示数据的最小单位:一个字节(byte,简称B,是使用8个二进......
  • 认识Spring AOP 面向切面编程
    一.什么是SpringAOP关于什么是SpringAOP.当我翻到官方文档的时候也是一惊LetusbeginbydefiningsomecentralAOPconceptsandterminology.ThesetermsarenotSpring-specific…unfortunately,AOPterminologyisnotparticularlyintuitive;however,itwoul......
  • 《Java编程思想第四版》学习笔记12
    对于一个复杂的对象,构建器的调用遵照下面的顺序:(1)调用基础类构建器。这个步骤会不断重复下去,首先得到构建的是分级结构的根部,然后是下一个衍生类,等等。直到抵达最深一层的衍生类。(2)按声明顺序调用成员初始化模块。(3)调用衍生构建器的主体。          ......
  • Spring 响应式编程-读书笔记
    本文为《Spring响应式编程》的读书笔记,响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点,同时响应式可以容忍网络延迟,并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速度最快的事务。通过本书可以学到以下内容:响应式编程基本原则和响应式流(Reactive......
  • 2018年【计算机视觉+机器学习+人工智能】领域重要会议汇总
    AAAI2018(美国新奥尔良)全称:theAssociationfortheAdvancementofArtificialIntelligence时间:2018.02.02-07地点:HiltonNewOrleansRiverside,NewOrleans,Lousiana,USA介绍:人工智能领域顶级会议官网:https://aaai.org/Conferences/AAAI-18/MMM2018(泰国曼谷)全称:the24rd......