MySQL的表锁

article/2025/10/13 15:03:47

目录

共享锁与排它锁(读锁和写锁)

1、锁定读

2、写操作

1、表锁

表级别的读锁和写锁

 意向锁(IS、Ik)

自增锁(TUTO-INC锁)

元数据锁(MDL锁)


共享锁与排它锁(读锁和写锁)

读锁(共享锁):针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,互相不阻塞

写锁(排它锁):当前写操作没有完成前,他会阻断其他的写锁和读锁。这样就保证了在一定时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的统一资源

对于innoDB来说,读锁可以加在表上,也可以加在行上。

(行级读写锁)如果一个事务T1已经获得了某行R的读锁,那么此时另一个的事务T2是可以去获得这个行R的读锁的,因为读取的操作并没有改变行而的数据;但是,如果某个事务T3想获得行R的写锁,他必须等T1,T2释放R上的读才可以。

1、锁定读

在采用加锁方式解决脏读、不可重复读、 幻读这些问题时,读取一条记录时需要获取该记录的S锁,其实是不严谨的,有时候需要在读取记录时就获取记录的X锁,来禁止别的事务读写该记录,为此MySQL提出 了两种比较特殊的SELECT语句格式:

对读取的记录加读锁

mysql在普通的SELECT语句后边加LOCK IN SHARE MODE ,如果当前事务执行了该语句,那么就会为读到的记录加读锁,这样允许别的事务继续获取这些记录的读锁(比方说别的事务也使用SELECT ... LOCK IN SHARE MODE语句来读取这些记录),但是不能获取这些记录的X锁(比如使用 SELECT ... FOR UPDATE 语句来读取这些记录,或者直接修改这些记录)。如果别的事务想要获取这些记录的X锁,那么它们会阻塞,直到当前事务提交之后将这些记录上的S锁释放掉。

对读取记录加写锁

 在普通的SELECT语句后边加FOR UPDATE ,如果当前事务执行了该语句,那么它会为读取到的记录加写锁,这样既不允许别的事务获取这些记录的写锁(比方说别的事务使用SELECT LOCK IN SHARE MODE 语句来读取这些记录),也不允许获取这些记录的X锁(比如使用SELECT   FOR UPDATE 语句来读取这些记录,或者直接修改这些记录)。如果别的事务想要获取这些记录的S锁或者写锁,那么它们会阻塞,直到当前事务提交之后将这些记录上的写锁释放掉。

MySQL8.0新特性:
在5.7及之前的版本,SELECT .. FOR UPDATE,如果获取不到锁,会一直等待,直到
innodb_ .lock_ wait_ timeout 超时。在8.0版本中,SELECT .. FOR UPDATE, SELECT ... FOR SHARE添加NOWAIT、SKIP LOCKED 语法,跳过锁等待,或者跳过锁定。


通过添加NOWAIT、SKIP LOCKED语法,能够立即返回。如果查询的行已经加锁: 
        那么NOWAIT会立即报错返回
        而SKIP LOCKED也会立即返回,只是返回的结果中不包含被锁定的行。

2、写操作

        平常所用到的写操作无非是DELETE、UPDATE 、INSERT 这三种:
●DELETE :
对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置,然后获取这条记录的X锁,再执行delete mark 操作。我们也可以把这个定位待删除记录在B+树中位置的过程看成是一个获取X锁的锁定
●UPDATE :在对一条记录做UPDATE操作时分为三种情况:


情况1:未修改该记录的键值,并且被更新的列占用的存储空间在修改前后未发生变化。
则先在B+树中定位到这条记录的位置,然后再获取一下记录的 写锁,最后在原记录的位置进行修改操作。我们也可以把这个定位待修改记录在B+树中位置的过程看成是一个获取写锁的锁定读。


情况2:未修改该记录的键值,并且至少有一一个被更新的列占用的存储空间在修改前后发生变化。则先在B+树中定位到这条记录的位置,然后获取一 下记录的X锁,将该记录彻底删除掉(就是把记录彻底移入垃圾链表),最后再插入一条新记录。这个定位待修改记录在B+树中位置的过程看成是获取个获取X锁的锁定读,新插入的记录由INSERT操作提供的隐式锁进行保护。


情况3:修改了该记录的键值,则相当于在原记录上做DEL ETE操作之后再来一次INSERT操作,加锁操作就需要按照DELETE和INSERT的规则进行了。

●INSERT :
一般情况下,新插入-条记录的操作并不加锁,通过一种称之为 隐式锁的结构来保护这条新插入的记录在本事务提交前不被别的事务访问。
 

操作力度划分:表级锁、页级锁、行锁

为了尽可能提高数据库的并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但是管理锁是很耗资源的事情(涉及获取、检查、释放锁等动作)。因此数据库系统需要在高并发响应和系统性能两方面进行平衡,这样就产生了“锁粒度(Lock granularity) ”的概念。

1、表锁

不依赖于储存引擎(不管你是MySQL的什么存储引擎,对于表锁的策略都是一样的),开销小(因为力度大)。表锁不会产生死锁问题。但是表锁会影响并发率

表级别的读锁和写锁

在对某个表执行SELECT、INSERT、 DELETE、 UPDATE语句时,InnoDB存储引擎是不会为这个表添加表级别的读锁或者写锁的。在对某个表执行一些诸如ALTER TABLE、DROP TABLE 这类的DDL语句时,其他事务对这个表并发执行诸如SELECT、INSERT、 DELETE、 UPDATE的语句会发生阻塞。同理,某个事务中对某个表执行SELECT、INSERT、DELETE、 UPDATE语句时,在其他会话中对这个表执行DDL语句也会发生阻塞。这个过程其实是通过在server层使用一种称之为元数据锁(英文名: Metadata Locks ,简称MDL )结构来实现的。

一般情况下, 不会使用InnoDB存储引擎提供的表级别的读锁和写锁。只会在一些特殊情况下,比方说崩溃恢复过程中用到。比如,在系统变量autocommit=0,innodb_ table_ locks = 1 时,手动获取InnoDB存储弓|擎提供的表t的S锁或者X锁可以这么写:

不过尽量避免在使用InnoDB存储弓|擎的表上使用LOCK TABLES 这样的手动锁表语句,它们并不会提供什么额外的保护,只是会降低并发能力而已。InnoDB的厉害之处还是实现了更细粒度的行锁,关于InnoDB表级别的读锁和写锁大家了解一下就可以了。

总结:
MyISAM在执行查询语句(SELECT) 前,会给涉及的所有表加读锁,在执行增删改操作前,会给涉及的表加写锁。InnoDB存储弓|擎是不会为这个表添加表级别的读锁或者写锁的。MySQL的表级锁有两种模式: (以MyISAM表进行操作的演示)
 

 意向锁(IS、Ik)

innoDB支持多粒度锁,他允许行级锁和表锁共存

1、意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。
2、意向锁是一种不与行级锁冲突表级锁,这一点非常重要。
3、表明“某个事务正在某些行持有了锁或该事务准备去持有锁”
意向锁分为两种:
●意向共享锁(intention shared lock, IS) :事务有意向对表中的某些行加共享锁(S锁)
●意向排他锁(intention exclusive lock, IX) :事务有意向对表中的某些行加排他锁(X锁)

 即:意向锁是由储存引擎自己维护的,用户无法手动操作意向锁,在为数据加共享/排它锁之前,InnDB会先获取数据行所在数据表的对应意向锁。

假如说我对这个表的数据上表锁,我首先要确定我有没有对其中一行上行级锁,这时候如果没有行级锁你就需要一条一条的判断了,而当你有行级锁时,会自动加意向锁,这时候加表锁的时候,就可以直接判断了。

从上面的案例可以得到如下结论:
1. InnoDB 支持多粒度锁,特定场景下,行级锁可以与表级锁共存。
2.意向锁之间互不排斥,但除了IS与S兼容外,意向锁会与共享锁/排他锁互斥。
3. IX, IS是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,s发生冲突。
4.意向锁在保证并发性的前提下,实现了行锁和表锁共存且满足事务隔离性的要求。

自增锁(TUTO-INC锁)

了解即可

主要是针对有自增主键的表,当要插入新的主键时,会对这个表上锁,当一个事务持有锁时,其他的事务阻塞。

三种锁定模式传统模式,连续锁定模式,交错锁定模式
 

元数据锁(MDL锁)

 MySQL5.5引入了meta data lock,简称MDL锁,属于表锁范畴。MDL的作用是,保证读写的正确性。比如,如果一个查询正在遍历一个表中的数据, 而执行期间另-个线程对这个表结构做变更,增加了一列, 那么查询线程拿到的结果跟表结构对不上,肯定是不行的。因此,当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。读写锁之间、写锁之间是互斥的,用来保证变
更表结构操作的安全性,解决了DML和DDL操作之间的一致性问题。不需要 显式使用,在访问一一个表的时候会被自动加上。


http://chatgpt.dhexx.cn/article/nf746Lvm.shtml

相关文章

连接器插针插孔接触不良该如何检测呢?

随着科学技术的发展,电子设备越来越复杂,性能要求越来越高,对其所应用的电子元器件的要求也越来越严。而连接器的性能、可靠性则直接影响到电子设备的性能及可靠性。这就使得电连接器的结构设计、制造工艺、装配等过程环节技术难度加大,不可靠因素增多,且变得更加复杂。因此,对…

IPX 、 IPEX 、 UFL连接器

I-PEX原先是个做连接器的公司,后被第一精工合并。 IPX 、IPEX 、 UFL、HSC应该都是同一种连接器,一般叫为IPEX或IPX,不过不同的厂商有自己系列和名称,如第一精工DAI-ICHI SHIKO叫为IPEX,广濑机电HIROSE的UFL和WFL&…

PCB中 D-Subminiature(DB接口) 连接器系列分类及带有3D封装绘制

PCB中 D-Subminiature(DB接口) 连接器系列分类及带有3D封装绘制 连接器分类 连接器是一种连接电气端子以形成电路的耦合装置。 借助连接器可实现电线、电缆、印刷电路板和电子元件之间的连接。D-Subminiature(DB接口)主要有直角…

使用HiFlow场景连接器查看每天处于地区的疫情

目录 使用HiFlow场景连接器查看每天处于地区的疫情 HiFlow场景连接器是什么? HiFlow场景连接器(目前)免费的 简单创建了一个查看所处地区流程: 首先你需要进行一下登录,登录进去后内容如下(你可以先看的&#xff0…

APC型光纤活动连接器有何特点?适合使用在什么场景?

1 概述 光纤活动连接器的型号主要由两个部分组成,比如我们常用的SC/UPC型连接器,SC表示连接器的接口类型,UPC表示插针端面形状。 连接器的接口分SC、FC、LC、ST、MPO等多钟类型,我们在工程中常用的主要有LC、FC和SC。连接器插针…

ThingsBoard网关mqtt连接器案例及双向RPC的BUG修复

文章目录 说明过程演示文字展示视频操作过程修改网关配置MQTT连接器配置JS模拟网关子设备添加网关设备启动网关启动js模拟设备创建开关小部件ABCDE MQTT连接器双向RPC的BUG修复 说明 通过下面案例了解MQTT连接器的使用,包括遥测,属性,单向双…

详解CAN总线:常用CAN连接器的使用方法

目录 1、9针DSUB 2、5针迷你C型接头 3、6针德驰DT04-6P 本文将分享几种常用的CAN连接器的连线和使用方法。 1、9针DSUB CiA推荐使用9针DSUB作为工业标准连接器,实物如下图所示: 引脚定义和说明如下所示: 2、5针迷你C型接头 DeviceNet协…

Exchange 2013接收连接器以及邮件客户端若干问题介绍

一. 什么是接收连接器? 上图显示出了Exchange 2013完整安装后默认的5种接收连接器。 接收连接器用于控制发送到Exchange组织的入站邮件流,不同的接收连接器负责监听不同的网络端口,独立控制客户的认证等。 接收连接器的作用域限于单台服务器&…

汽车常用连接器接口定义

OBD II 连接器 也称SAE J1962连接器,其包含有CAN线,K线,J1850总线。 1. J1962公接头(中间)和J1962母接头(下)标题 表1 OBD-II连接器端口定义 ContactGeneral allocation1,3,8,9,11,12,13 Assig…

Gen-Z 可扩展连接器和SFF-TA-1002规范。

Hello大家好,在最近的一个项目中,我遇到了一个问题,就是说Gen-Z连接器和符合SFF-1002规范的连接器是什么关系?二者是不是同一种连接器?带着问题,我准备给他小刀拉屁股——开开眼儿。 话说2017年6月份&…

线束音视频传输连接器FAKRA与HSD区别?

为了防止有人看不明白文中涉及的术语和定义,我这里先解释一下: FAKRA连接器 FachkreisAutomobil Connector FAKRA是一种射频信号连接器(以下简称FAKRA)。 HSD连接器 HighSpeed Data Connector HSD是一种高速数据连接器,支持USB2.0、LVDS、IEE…

FMC标准以及FMC连接器介绍

一、FMC标准 FMC标准描述了一个通用的模块,它是以一定范围的应用,环境和市场为目标的。 该标准由包括 FPGA 厂商和最终用户在内的公司联盟开发,旨在为基础板(载卡)上的 FPGA 提供标准的夹层板(子卡)尺寸、连接…

关于使用腾讯云HiFlow场景连接器每天提醒签到打卡

目录 前言: HiFlow: 配置:​编辑 设置执行条件 ​编辑 设置群发机器人: 缺点与不足: 总结: 前言: 在我们日常生活中总会有一些签到比如:我们的掘金签到,王者荣耀签…

七、Kafka Connector (连接器)

Kafka Connect 是一种用于在 Apache Kafka 和其他数据系统之间可扩展且可靠地流式传输数据的工具。它使快速定义将大型数据集移入和移出 Kafka 的连接器变得简单。Kafka Connect 可以摄取整个数据库或从应用程序服务器收集指标到 Kafka 主题中,使数据可用于低延迟的…

连接器是什么?连接器有什么作用?

连接器是什么? 连接器,即CONNECTOR。 在中国也称为连接器、插头和插座。 一般指连接器。 即连接两个有源设备以传输电流或信号的设备。 广泛应用于航空、航天、国防等军事系统。 连接器是我们电子工程技术人员经常接触到的部件。 SIM卡插座连接器是手机、…

一分二网线连接器正确使用方法

考虑到公司有很多同事需要连接pc的同时要连接无线路由器,但是每个工位只有一个网络面板。 所以就采购了一批一分二网线连接器 本来以为可以直接把一根网线分成两根直接使用,想法如下图: 只能说想法太天真!!&#xff0…

电路板常用连接器(接插件)介绍与选型建议(板对板连接器,板对线连接器,线对线连接器等)

提示:本文介绍常用的连接器,这些连接器适合常规的工作条件。本文适合刚接触电路板或者对连接器不熟悉的攻城狮阅读。 文章目录 前言一、连接器具体应该叫什么?二、连接器型号分类1.目前的型号是怎么来的和分类2.选型注意事项3.连接器的购买与…

常见的光纤连接器有哪些?光纤连接器的种类科普

光纤连接器根据光纤连接器结构类型的不同可以分为不同的类型,根据传输介质的不同可分为单模光纤连接器和多模光纤连接器; 适用于FC、SC、ST、D4、DIN、Biconic、MU、LC、MT等类型; 连接器按引脚端面可分为PC(UPC)和APC…

Wafer连接器的介绍

Wafer连接器通常是指连接器底座(芯片座)连接器,一般由金属件和塑料件组装而成。 与只有塑料件(有些有铁壳)的软管不同,它是由电线和端子组装而成的。wafer插座连接器由固定端电连接器,即阴接触件&#xff0…

连接器分类及选型

常用连接器分类 D型连接器 射频连接器 圆形连接器 背板连接器 RJ连接器(电话连接器、网口连接器) 扁平电缆连接器 功率连接器 端子类连接器 标准间距连接器 欧式连接器 光纤连接器 其他连接器 D型连接器 D型普通:9芯、15芯、25…