首页 > 其他分享 >关于乐观锁上锁成功的前提条件讨论

关于乐观锁上锁成功的前提条件讨论

时间:2023-08-14 16:36:59浏览次数:32  
标签:讨论 库存 版本号 锁上 用户 并发 图书 操作 前提条件

在计算机编程领域,乐观锁(Optimistic Locking)是一种处理并发访问共享数据的策略,它的基本思想是先进行操作,然后在更新数据之前检查是否有其他并发操作修改了数据。如果没有冲突,操作可以成功执行;如果存在冲突,系统需要进行冲突处理,例如回滚操作、重新尝试或者通知用户。

乐观锁的设计目标是:尽量避免对数据进行显式的加锁,以提高系统的性能和并发性。

乐观锁的核心概念:在执行更新操作前,首先读取数据的一个表示(如版本号、时间戳等),然后在更新时检查这个表示是否与预期值相匹配。如果匹配,则说明在读取数据和执行更新之间没有其他并发操作修改数据,操作可以成功进行;如果不匹配,则表示发生了冲突,需要进行相应的处理。

乐观锁上锁成功的前提条件是:

  1. 读取数据的表示必须与更新数据时使用的表示相匹配,即在更新之前没有其他操作修改了数据。
  2. 操作执行期间,其他并发操作没有修改相同数据。

以下是一个详细的例子,来说明乐观锁的工作原理和上锁成功的前提条件:

示例:图书库存管理系统

假设有一个在线图书商城,多个用户可以同时购买同一本图书。为了保证库存数据的一致性,我们使用乐观锁来处理并发购买操作。

  1. 数据结构

    每本图书在数据库中都有一条记录,包括图书ID、图书名称、库存数量和版本号。版本号用于实现乐观锁。

    Book Table:
    | BookID | BookName  | StockQuantity | Version |
    |--------|-----------|---------------|---------|
    | 101    | Book A    | 10            | 1       |
    | 102    | Book B    | 15            | 2       |
    | ...    | ...       | ...           | ...     |
    
  2. 购买操作

    当用户要购买一本图书时,系统会执行以下操作:

    a. 用户选择图书并点击购买。
    b. 系统读取图书的当前版本号和库存数量。
    c. 用户确认购买。
    d. 系统再次读取图书的当前版本号和库存数量,检查是否与之前的读取结果相同。
    e. 如果版本号匹配且库存数量充足,系统执行购买操作,将库存数量减少,版本号递增。
    f. 如果版本号不匹配或库存数量不足,表示在购买确认过程中发生了冲突,需要进行冲突处理。

  3. 乐观锁的工作原理

    • 用户A和用户B同时想购买同一本图书(例如Book A)。
    • 系统读取图书的版本号和库存数量,假设当前版本号为1,库存数量为10。
    • 用户A确认购买,系统再次读取图书的版本号和库存数量,仍然是版本号1、库存数量10。
    • 用户B也确认购买,系统再次读取图书的版本号和库存数量,仍然是版本号1、库存数量10。
    • 用户A的购买操作先完成,将库存数量减少为9,并将版本号增加为2。
    • 用户B的购买操作尝试减少库存数量,但发现版本号不匹配(当前为2,而操作开始时读取的是1),说明在用户B确认购买前已经有其他操作修改了数据,购买操作失败。
  4. 冲突处理

    当用户B的购买操作失败时,系统可以采取以下一些冲突处理策略:

    • 回滚用户B的操作,提示用户重新尝试购买。
    • 通知用户库存不足,推荐其他相关图书。
    • 自动尝试重新购买,直到操作成功或达到最大尝试次数。

乐观锁的优缺点:

优点

  • 不会阻塞其他操作,提高了系统的并发性能。
  • 对于多数情况下没有并发冲突的场景,乐观锁可以更好地发挥作用。

缺点

  • 需要实现冲突处理逻辑,增加了开发复杂性。
  • 在高并发情况下,冲突处理可能会增加系统的负担。
  • 无法解决所有并发冲突,一些复杂的场景仍然需要使用悲观锁等其他策略。

总结

乐观锁是一种在并发访问数据时尽量避免显式加锁的策略,它通过先进行操作再检查数据是否被修改来保证数据的一致性。上锁成功的前提条件是读取数据的表示与更新数据时使用的表示相匹配,并且操作期间没有其他并发操作修改了相同数据。乐观锁在一些特定的场景下可以提高系统的性能和并发性。

标签:讨论,库存,版本号,锁上,用户,并发,图书,操作,前提条件
From: https://www.cnblogs.com/sap-jerry/p/17629038.html

相关文章

  • 欢迎大家加入JAVA技术开发讨论
    最近加了一些java的开发群,感觉每个群的技术氛围都不浓厚,很多问题出来后,根本没人理会。想现在建立一个技术氛围浓厚的java技术问答群,欢迎有兴趣的同学加入。近期也汇总了一些觉得不错的资料,欢迎大家一起进步学习!注:本群不收费,也不做广告推广,仅技术交流。加群方式:点击链接获......
  • 《动力学初步分析与讨论》 回复
    《动力学初步分析与讨论》      https://tieba.baidu.com/p/8542422933     回复  13楼 @黎合胜 , 3楼的题目,  我的想法和 @进化的力学一样,  kQ/L² ,  L 是 时刻t的L就行了。 至于要考虑速度v带来的相对论效应......
  • 讨论 | 如何为雷达学习者建立一个较好的知识开源分享交流空间?(知乎+公众号+微信群模式)
    本文编辑:@调皮连续波,保持关注调皮哥,获得更多学习内容和建议!自从建立了雷达工程技术交流微信群以来,随着雷达研究人员们的激烈讨论,我逐渐意识到了一个严重的问题,即:各位雷达学习者在雷达微信群里咨询的问题,只能够解决的此刻当事人遇到的疑问,而对于后来可能会遇到同样问题的雷达学习者,......
  • Java和线程的一些讨论
    Java语言及Java的多线程机制,其中:第一部分是对Java简介,包括Java产生的背景和经过、Java的特点和应用方向、Java发展趋势.第二部分介绍面向对象的Java编程方法、及与C++语言作了一些比较.包括如何编写JavaApolet、在Applet中如何实现各种常用对象、以及使用Java实现高级编程(......
  • 关于回归的线性模型的讨论
    关于回归的线性模型的讨论1.回归线性模型综述这篇文章我们来讨论回归问题。回归问题的目标是在给定D维输入(input)变量x的情况下,预测一个或者多个连续目标(target)变量t的值。典型的回归问题的例子是:多项式曲线拟合问题。多项式是被称为线性回归模型的一......
  • 线性方程组数学原理、矩阵原理及矩阵变换本质、机器学习模型参数求解相关原理讨论
    线性方程组数学原理、矩阵原理及矩阵变换本质、机器学习模型参数求解相关原理讨论1.线性方程组0x1:无处不在的线性方程组日常生活或生产实际中经常需要求一些量,用未知数x1,x2,....,xn表示这些量,根据问题的实际情况列出方程组,而最常见的就是线性方程组(当然并不......
  • 看了那场直播后,我们发起了一个讨论
    几天前,我们做了一场直播,关于如何用Serverless技术让文化古籍“活过来”。完整视频进入阿里云云原生视频号看直播回放背景信息:通过阿里云函数计算帮助复旦大学特藏中心建立数字图书馆,为用户提供更丰富、更具互动性的古籍浏览体验。最初,复旦大学图书馆特藏中心希望和国外特......
  • Hybird 技术讨论:热更新原理解析
    原生应用VS混合应用大家对于原生应用和混合应用已经非常熟悉了,这里就不再进行详细的介绍,用通俗易懂的话解释下他们的一些特点。 1、原生应用在Android、iOS等移动平台上利用提供的开发语言、开发类库、开发工具进行App软件开发。比如Android是用Java、Eclipse......
  • 一群伪专家讨论“motherland”和“fatherland”,说说个人的观点
     看了一个视频:中国的文化里在找妈,美国的文化里在找爸!如何真正教育子女?  =============================================     ===================================================  自己最接受不了的就是一群伪专家在公众频道上胡说八道,一群伪文人靠着......
  • 新书上市|当我们讨论“量子计算”时我们在讨论什么?
    请收好,这是一份《量子计算公开课》阅读指南。量子力学是对概率法则的精彩推广:基于2-范数而不是1-范数,基于复数而不是非负实数。它可以完全独立于物理学应用而被研究(并且事实上,这样做会为之后学习物理学应用提供一个很好的起点)。这种推广的概率理论自然地指向了一个新的计算模型——......