MySQL最全锁详解:行锁、表锁、悲观锁、乐观锁、共享锁

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等) 阅读详情

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。

今天就分享下MySQL相关的最全锁,希望你学习后能更好的掌握数据库锁。

MySQL锁概述

相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

比如:

  1. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);

  2. InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁。

MySQL主要的两种锁的特性可大致归纳如下:

 

  • 表级锁:开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。

  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  • 页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

行锁 和 表锁

1.主要是针对锁粒度划分的,一般分为:行锁、表锁、库锁

(1)行锁:访问数据库的时候,锁定整个行数据,防止并发错误。

(2)表锁:访问数据库的时候,锁定整个表数据,防止并发错误。

2.行锁 和 表锁 的区别:

  • 表锁:开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低

  • 行锁:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

悲观锁 和 乐观锁

(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

(3)悲观锁 和 乐观锁的区别:

两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

共享锁

共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一把门,它拥有多个钥匙一样。就像这样,你家有一个大门,大门的钥匙有好几把,你有一把,你女朋友有一把,你们都可能通过这把钥匙进入你们家,这个就是所谓的共享锁。

刚刚说了,对于悲观锁,一般数据库已经实现了,共享锁也属于悲观锁的一种,那么共享锁在mysql中是通过什么命令来调用呢。通过查询资料,了解到通过在执行语句后面加上lock in share mode就代表对某些资源加上共享锁了。

什么时候使用表锁

对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁。

  • 第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。

  • 第二种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销。

当然,应用中这两种事务不能太多,否则,就应该考虑使用MyISAM表了。

表锁和行锁应用场景

  • 表级锁使用与并发性不高,以查询为主,少量更新的应用,比如小型的web应用;

  • 而行级锁适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统。

更多架构师进阶系列

 

 

 

【AI智能体】QClaw 对接GitHub处理自动化任务实战操作详解 QClaw 对接GitHub处理自动化任务实战操作详解 阅读详情

相关推荐

使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战

A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 基本概念 首先在大学我们遇到最多的算法Dijkstra、Floyd、广度搜索、深度搜索。关于这些算法我们以后再慢慢的研究,今天的重点在A算法上。A算法是一种启发式算法。与上述几种算法不同的是A*算法在考虑起始节点的同时还会考虑到目标节点的代价。 在A*算法中我们给每个节点都定义一些属性。最基本的就是下文提到的三基数-这里的三基数是我自己定义.

Java进阶营 312

阿里P8架构师谈:MySQL行锁、表锁、悲观锁、乐观锁的特点与应用

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。 比如: MyISAM和MEMORY...

weixin_34289454的博客 289

InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用)

本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。

g9h0i1的博客 960

面试必备-行锁、表锁 - 乐观锁、悲观锁的区别和联系(史上最全)

锁 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 or 总是认为多用户访问数据库时会产生并发冲突,因此需要消除所有可能会产生冲突的操作 共享锁(Sh

yxg520s的博客 3845

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装

基于 parallels ubuntu 20.04 LTS (focal) 的ros+px4+gazebo 安装。

weixin_40132006的博客 2241

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1096

MySQL之锁总结(行锁,表锁,乐观锁,悲观锁)

一、锁简单介绍 从锁的粒度,可以分为两大类 行锁:开销大,加锁慢,会出现死锁,锁定力度小,发生锁冲突的概率低,并发读高。 表锁:开销小,加锁快,不会出现死锁,锁定力度大,发生锁冲突的概率高,并发度低。 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。 特点 开销大,...

weixin_44026997的博客 392

GMSL2摄像头接入避坑指南:从FMC子卡配置到V4L2调用的完整流程(附Ubuntu20.04实测)

本文详细解析了GMSL2摄像头接入的全流程,从FMC子卡配置到V4L2调用的完整指南。基于XC7Z100平台实测经验,提供了硬件选型、带宽优化、Linux驱动配置及高分辨率采集的实战技巧,帮助开发者规避常见问题,提升系统稳定性与性能。

weixin_33737774的博客 419

悲观锁,乐观锁,行锁,表锁的所有区别与案例分析及个人总结

部分来源网址: https://blog.youkuaiyun.com/puhaiyang/article/details/72284702 一,行锁: 行锁的劣势:开销大;加锁慢;会出现死锁 行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强 加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SE...

Xiaoqiu的博客 4746

华为OD机试 - 商品推荐多属性排序 - 数组(Python/JS/C/C++ 双机位A卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。双十一来临,小王准备买某个购物平台买坚果。在输入坚果时,页面默认按照综合推荐列表。小王想知道这个综合排序时如何完成的,于是便开始思考算法题。经过一番操作后,完成它的多个关键词排序算法。希望你给小王提供一份正确的排序结果,验证其实现算法结果的准确性

学Java,找哪吒 623

YOLOv8改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

HorNet: 利用递归门控卷积实现高效高阶空间交互GnConv(Recursive Gated Convolution,递归门控卷积)

Limiiiing的博客 325

操作系统-数据库-(通用锁思想)MySQL-锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析

加锁的基本单位为next-key lock = 间隙锁+行锁,范围为前开后闭,但加锁过程为先申请间隙锁在申请行锁。只有访问到的对象才可以加锁。等值查询:①主键索引:next-key lock会退化为行锁;②非主键索引:保持原样等值查询:InnoDB会向右继续遍历,找到第一个不符合的数据行,加next-key lock并退化为间隙锁。范围查询:先找到复核条件的一行数据,再向右查找,向右查找时加的锁不会退化为间隙锁。无论什么情况下,InnoDB 会往前扫描到第一个不满足条件的行为止。

S_ZaiJiangHu的博客 4125

YOLOv12超参数智能优化:基于内置Ray Tune的自动化调优实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 目标检测模型的性能瓶颈往往源于超参数配置不当。传统手动调优方式不仅耗时耗力,且难以找到全局最优解。YOLOv12集成的Ray Tune框架为解决这一难题提供了完整方案,通过分布式异步优化算法,可实现超参数搜索效率的指数级提升。实际测试表明,采用Ray Tune自动调优的YOLOv12模型,在COCO数据集上mAP指标平均提升3.8%,收敛速度加快2.1倍。在VisDrone无人机数据集上的跨域测试

LXY_LOVE36的博客 119

mysql行锁源码详解_最全MySQL锁讲解:页锁、共享锁、行锁、表锁、悲观锁、乐观锁...

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。今天就分享下MySQL相关的最全锁,希望你学习后能更好的掌握数据库锁。MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同...

weixin_42452483的博客 120

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MySql悲观锁(行锁)和乐观锁

一、悲观锁VS乐观锁 引言 为什么需要锁(并发控制) 在并发的环境中,会存在多个用户同时更新同一条数据,这时就会产生冲突。 冲突结果: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。 因此为了解决上述问题,引入了并发控制机制。 乐观锁(乐观并发控制)和悲观锁(悲观并发控制)是并发控制的主要手段,其实不仅关系型数据库中有乐观锁和悲观锁的概念,像redis,memcached等都有类似的概念。所以,不要把乐观.

Java后端技术栈 3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MySQL锁机制详解-表锁与行锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源,如CPU、RAM、I/O等的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题。此外,锁冲突也是影响数据库并发访问性能的一个重要因素。

huangjhai的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL锁机制揭秘:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁的全面解读

是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引,则加的行锁会自动升级为表锁,因为行锁是基于索引去进行操作的,所以想要加行锁,就一定要在条件字段为索引的基础上进行操作。

云泽的博客 1771

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁乐观锁 VS 悲观锁1.乐观锁2.悲观锁3.总之公平锁 VS 非公平锁1.公平锁2.非公平锁3.典型应用独享锁 VS 共享锁1.独享锁2.共享锁3.比较4.AQS分段锁Java线程锁多线程的缘由多线程并发面临的问题4种Java线程锁(线程同步)1.synchronized2.ReentrantLock3.Semaphore4.At...

u013030086的博客 4933

MySql: 表级锁、行级锁、共享锁、排他锁、乐观锁、悲观锁

1.表级锁与行级锁 表级锁: table-level locking,锁住整个表。 开销小,加锁快。 不会死锁(一次性加载所需的所有表)。 锁粒度大,发生锁冲突概率大,并发效率低。 适合查询。 行级锁: row-level loking,锁住一行记录。 开销大,加锁慢。 会死锁。 锁粒度小,发生所冲突概率小,并发效率高。 适合并发写,事务控制。 并不是直接丢记录行加锁,而是对行对应的索引加锁...

韩超的博客 (hanchao5272) 4835

对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解

记得在上大学那会开始,在大学的课堂上,常常会听到老师讲什么共享锁,排它锁各种锁的词汇,以前仅仅听过一次就没有管了,并没有进行深入的研究 最近,在各种群里,又看见了什么乐观锁、悲观锁什么鬼的感觉很高级的词汇,于是乎今天对这几个概念进行学习,揭开它神秘的面纱,缕缕思路记录下我对这几个概念的想法 实验环境: mysql5.6 存储引擎:innoDB 我们在操作数据库的时候,可能

水中加点糖 10万+

MySQL InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表 锁、死锁概念

注:MySQL是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于InnoDB存储引擎,其他引擎的表现,会有较大的区别。

weixin_48491166的博客 1251

MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

在MyISAM存储引擎中,当执行SQL语句的时候是自动加的。在InnoDB存储引擎中,如果没有使用索引,表锁也是自动加的。共享锁->读锁->S锁排它锁->写锁->X锁在默认的情况下,select是不加任何行锁的,事务可以通过以下语句显示给记录集加共享锁或排他锁。InnoDB基于行锁还实现了MVCC多版本并发控制,MVCC在隔离级别下的Read committed和Repeatable read下工作。MVCC实现了读写不阻塞。希望这篇文章能帮到大家,希望大家也多多支持。

Minxinbb 3087

【锁住精华】MySQL锁机制全攻略:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁

是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引,则加的行锁会自动升级为表锁,因为行锁是基于索引去进行操作的,所以想要加行锁,就一定要在条件字段为索引的基础上进行操作。

云泽的博客 1192

mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁

锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

qq_68883928的博客 1435

mysql(10)MySQL行锁、表锁、悲观锁、乐观锁的特点与应用

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。 比如: MyISAM和MEMORY...

cowbin2012的专栏 1万+

MySQL InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

若事务 1 对数据对象A加上X锁,事务 1 可以读A也可以修改A,其他事务不能再对A加任何锁,直到事物 1 释放A上的锁。这保证了其他事务在事物 1 释放A上的锁之前不能再读取和修改A。排它锁会阻塞所有的排它锁和共享锁读取为什么要加读锁呢:防止数据在被读取的时候被别的线程加上写锁,使用方式:在需要执行的语句后面加上。

程序员伊成 1092
上一篇: BAT面试必考题:高并发场景下单线程的Redis为什么还这么快?
下一篇: 史上最强Dubbo面试26题和答案:核心组件+服务治理+架构设计等
JavaAOE
博客等级 码龄7年 27粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值