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

理解乐观锁和悲观锁

时间:2024-11-09 13:09:19浏览次数:1  
标签:场景 版本号 更新 乐观 并发 理解 悲观

乐观锁:认为每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改

悲观锁:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。

使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁

 

乐观锁和悲观锁是并发控制中两种常见的锁机制,它们分别基于不同的假设来处理数据的并发访问。

乐观锁

实现
  1. 版本号机制:在数据表中增加一个版本号字段,每次更新数据时,版本号加1。更新前检查版本号是否发生变化,如果发生变化则更新失败。
UPDATE table SET value = ?, version = version + 1 WHERE id = ? AND version = ?
  1. 时间戳机制:在数据表中增加一个时间戳字段,每次更新数据时,时间戳更新为当前时间。更新前检查时间戳是否发生变化,如果发生变化则更新失败。
UPDATE table SET value = ?, timestamp = CURRENT_TIMESTAMP WHERE id = ? AND timestamp = ?
场景
  • 多读少写:适用于读多写少的场景,因为乐观锁在读取数据时不加锁,可以提高读取的吞吐量。
  • 低并发:适用于并发冲突较少的场景,因为乐观锁在更新数据时需要检查数据是否被修改,如果冲突频繁,可能会导致大量重试。

悲观锁

实现
  1. 数据库锁:使用数据库的锁机制,如​​SELECT ... FOR UPDATE​​。
SELECT * FROM table WHERE id = ? FOR UPDATE
  1. 编程语言级别的锁:使用编程语言提供的锁机制,如Java中的​​synchronized​​关键字或​​ReentrantLock​​。
synchronized (lockObject) {
  
}
场景
  • 多写少读:适用于写多读少的场景,因为悲观锁在读取数据时就加锁,可以确保数据的一致性。
  • 高并发:适用于并发冲突较多的场景,因为悲观锁在读取数据时就加锁,可以避免频繁的更新冲突。

标签:场景,版本号,更新,乐观,并发,理解,悲观
From: https://www.cnblogs.com/89564f/p/18536655

相关文章

  • 理解乐观锁和悲观锁
    乐观锁:认为每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改悲观锁:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁  乐观锁和悲......
  • NLP论文速读|Describe-then-Reason: 通过视觉理解训练来提升多模态数学的推理
    论文速读|Describe-then-Reason:ImprovingMultimodalMathematicalReasoningthroughVisualCompre-hensionTraining论文信息:简介:   该论文试图解决的问题是开源多模态大型语言模型(MLLMs)在复杂多模态数学推理任务中的表现不佳的问题。尽管这些模型在处理涉......
  • SpringBoot驱动的共享汽车管理解决方案
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理共享汽车管理系统的相关信息成为必然。开发合适的共享汽车管理系统,可以方便管理人员对共享......
  • 【数据结构】快慢指针探秘:理解链表与数组中的环结构
    在处理链表或数组时,我们经常需要在一次遍历中找到特定的位置或检测某种模式。这时,快慢指针技术就能成为强大的工具,尤其在链表面试题中。本文将详细介绍什么是快慢指针、它们的工作原理,并通过一些实际应用帮助你理解这种技巧。学完后,你将掌握这种技巧的核心以及如何在代码中......
  • SQL语句的基本理解与应用
        首先借用Freesql的官方文档中的一段复杂代码举例,说明SQL语句的基本使用并最终实现读懂下列的复杂代码INSERTINTO[Role]([Name])OUTPUTINSERTED.[Id]as[Id],INSERTED.[Name]as[Name]VALUES(N'role1'),(N'role2')INSERTINTO[User]([Name])OUTPUTINS......
  • 原木、实木和家具是常见的木材相关术语,它们之间有一定的区别,但容易让人混淆。下面我将
    原木、实木和家具是常见的木材相关术语,它们之间有一定的区别,但容易让人混淆。下面我将为你详细解释如何区分这三者以及它们的不同之处,帮助你更好地理解和区分这些概念。1. 原木(RawWood)定义:原木是指直接从树木中砍下来的粗大木材,未经任何加工。它通常是树干或大树枝,外形不规则,......
  • 深入理解Java虚拟机 --- 运行时数据区
    程序计数器每个线程都有自己的程序计数器(线程私有),它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令。为什么程序计数器线程私有主要是为了保证进程切换之后能够恢复到......
  • 深入理解Java虚拟机 --- 垃圾标记/收集算法
    在开始本章之前,我们得了解一个概念,那就是我们怎么知道这个对象是"垃圾"?所以如何定义垃圾就成为我们第一个需要探讨的重要的点之一。垃圾标记算法常见的垃圾标记算法有:引用计数算法和可达性分析算法。引用计数算法实现思路每个对象去额外存储一个引用计数器,这个计数器统计了对......
  • 深入理解Java虚拟机 --- 垃圾回收器
    Serial收集器HotSpot虚拟机运行在客户端模式下的默认新生代收集器。类型:单线程串行垃圾回收器垃圾收集算法:复制算法作用区域:新生代特点:1、只会用单个线程去完成垃圾收集工作,用户线程会STW,直到收集结束。2、没有线程交互,专心做垃圾收集,获得最高的单线程收集效率。ParNew收......
  • 深入理解Java虚拟机 --- 内存分配与回收策略
    对象优先在Eden区分配大多数情况下,对象在Eden区进行分配。当Eden区没有足够的空间来进行分配时,就会触发YoungGC(MinorGC)。当触发YoungGC时,如果Survivor区不够放存活的对象,那么就会触发分配担保机制提前转移到老年代。大对象直接进入老年代大对象的问题:1、容易导致内存明......