乐观锁与悲观锁:高并发场景下的选择

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

乐观锁与悲观锁:高并发场景下的选择

  • 前言
  • 乐观锁
  • 悲观锁
  • 选择锁的依据
  • 结语

前言

在面对高并发的场景下,选择合适的锁策略对于保障数据一致性和提高系统性能至关重要。本文将深入探讨乐观锁和悲观锁两种常见的锁机制,分析它们在高并发环境中的优劣势,以便更好地选择适用于不同场景的锁策略。

乐观锁

原理

乐观锁假设冲突的概率较低,因此在大部分情况下不加锁,而是在更新操作时检查在此期间是否有其他事务对数据进行了修改。最常见的实现方式是使用版本号机制,每次更新都伴随着版本号的增加

优势

  • 无阻塞: 乐观锁不会阻塞其他事务的读写操作,因此在读多写少的场景下性能较好。
  • 无死锁: 由于不加锁,不存在死锁的风险。

劣势

  • 冲突处理: 当多个事务冲突时,需要有一套机制来处理这种冲突,通常是通过重试或回滚事务。

悲观锁

原理

悲观锁认为冲突的概率较高,因此在对数据进行操作前先加锁,以防止其他事务的干扰。典型的实现包括数据库的行级锁和排他锁。

优势

  • 冲突处理简单: 由于加锁操作,不需要额外的冲突处理机制。
  • 适用于写多读少: 在写多读少的场景下,悲观锁的性能较为可观。

劣势

  • 阻塞: 加锁会导致其他事务在获取锁之前阻塞,影响并发性能。
  • 死锁风险: 使用悲观锁时,存在死锁的风险,需要合理设计事务流程来避免。

选择锁的依据

1、并发度

高并发读写场景: 乐观锁更适合高并发读写场景,因为不加锁的特性使得读操作不受阻塞。
写多读少场景: 悲观锁在写多读少的场景下更具优势,因为写操作需要确保数据的一致性。

2、数据冲突概率

低冲突概率: 如果数据冲突的概率较低,可以考虑乐观锁。
高冲突概率: 如果数据冲突概率较高,悲观锁更为合适。

3、复杂度

处理复杂度: 乐观锁在处理冲突时相对较为复杂,需要一定的重试和回滚机制。
简单性: 悲观锁在处理冲突时较为简单,加锁即可。

结语

在实际应用中,乐观锁和悲观锁都有其适用的场景,选择应根据具体业务需求和并发访问的特点。在读多写少的情况下,乐观锁可以更好地发挥其性能优势;而在写多读少的情况下,悲观锁则更为适用。合理选择锁策略是高并发系统设计的关键一环,需要充分考虑业务场景和系统特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战纪实 | 记一次攻防演练

看到一处登录后台,各种操作都尝试过无果,翻了一下js,看到一处文件上传接口泄露(没图了,已经整改了) 构造上传数据包,很nice,上传成功 直接连接webshell,搭建隧道进行内网穿透 翻看配置文件&…

python两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

笙默考试管理系统---countop

笙默考试管理系统---countop 目录 笙默考试管理系统---countop 一、 笙默考试管理系统-MyExamTest----countop 二、 笙默考试管理系统-MyExamTest----countop 三、 笙默考试管理系统-MyExamTest----countop 四、 笙默考试管理系统-MyExamTest----countop 五、 笙默…

TCP 拥塞控制对数据延迟的影响

哈喽大家好,我是咸鱼 今天分享一篇文章,是关于 TCP 拥塞控制对数据延迟产生的影响的。作者在服务延迟变高之后进行抓包分析,结果发现时间花在了 TCP 本身的机制上面:客户端并不是将请求一股脑发送给服务端,而是只发送…

【开源】基于JAVA语言的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

字符串不可变性以及StringBuilder和StringBuffer在字符串拼接中的作用和扩容机制

java字符串的不可变性 在jdk1.8及以前,字符串底层存储用的是一个字符(char)类型的数组,jdk1.9之后用的是整型中的字节型(byte)数组来存储字符串。以下下主要以jdk1.8为例子展开。 private final char value…

新能源汽车出海业务之报关

引言 在做中国新能源汽车出海业务的信息化建设过程,秉承着深入了解业务的原则,对业务全链路进行学习了解总结,本文是针对出口报关业务环节的一些个人积累总结,供与诸位交流学习。 业务概述 报关是指在国际贸易中,出口…

Day34 贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果

贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果 1005. K 次取反后最大化的数组和 思路 第一步,从前向后遍历,遇到负数将其变为正数,同时K–第二步:如果K还大于0,那么反复转变数值最小的…

Marin说PCB之关于1000 BASE-T1--ESD的处理知多少?

对于板子上的ESD器件想必大家做硬件或者是layout应该的不陌生吧,我们几乎遇到大部分板子上面的接口部分都会添加这个ESD器件,例如那些USB,MIPI接口,百兆/千兆-T1以太网连接器等。 其中T1连接器用的是罗森博格家的,在这个链路中有一…

腾讯云轻量化应用服务器_轻量化应用服务器_轻量化私有云

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别便宜,大带宽,但是限制月流量,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年&#xff0c…

第二百七十四回

文章目录 1. 概念介绍2. 方法与类型2.1 使用方法2.2 常见类型 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何加载本地图片"相关的内容,本章回中将介绍如何获取文件类型.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回…

[python]变量与常量

变量 语法结构: 变量名valueluck_number8在堆内存中开一块空间,放入8,栈内存中变量名luck_number指向堆当中的内存空间 通过赋不同类型的值,可以直接动态修改python变量的数据类型 在python中允许多个变量指向同一个值 nonum…

Docker 仓库管理

Docker 仓库管理 仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。 Docker Hub 目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求…

如何在MinIO存储服务中通过Buckets实现远程访问管理界面上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等…

chatgpt和文心一言哪个更好用

ChatGPT和文心一言都是近年来备受关注的人工智能语言模型。它们在智能回复、语言准确性、知识库丰富度等方面都有着较高的表现。然而,它们各自也有自己的特点和优势。在本文中,我们将从这几个方面对这两个模型进行比较,以帮助您更好地了解它们…

C#: richTextBox 富文本编辑控件使用

说明:在C#中,RichTextBox 是一个非常有用的控件,它允许用户在 Windows Forms 应用程序中编辑富文本格式的文本。RichTextBox 控件提供了许多功能,如字体、颜色、背景颜色、下划线、删除线、项目符号和编号列表等。 1.创建一个简单…

ArcGIS Pro 标注牵引线问题

ArcGIS Pro 标注 模仿CAD坐标牵引线问题 右键需要标注的要素,进入标注属性。 选择背景样式 在这里有可以选择的牵引线样式 选择这一个,可以根据调整间距来进行模仿CAD标注样式。 此图为cad样式 此为调整后gis样式 此处可以调整牵引线的样式符号 …

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.4、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化,它的存在是为了带来查询效率的提升…

KubeSphere 开源社区 2023 年度回顾与致谢

2023 年结束了,让我们再一次一起回顾一下 KubeSphere 开源社区在过去一年的变化。更重要的是,本篇文章将会对 2023 年所有参与过 KubeSphere 社区贡献的成员致以最诚挚的感谢,快来看看有没有你! 开源项目发展情况 2023 年&#…

go实现判断20000数据范围内哪些是素数(只能被1和它本身整除的数),采用多协程和管道实现

实现一个并发程序,用于寻找 20000 以内的所有素数。使用了 Goroutines 和 Channels 来分发和处理任务,并通过 WaitGroup(实现为 exitChan)来同步 Goroutines 的退出。 一.GO代码 package mainimport ("fmt""time…