MySQL-InnoDB常用锁类型解析

article/2025/8/18 3:11:23

Shared(乐观锁) and Exclusive Locks(互斥锁):

        InnoDB有两种锁类型,Shared(s) and Exclusive(x) Locks(乐观锁和互斥锁)。

        Shared(s)Locks:允许持有该锁的事务读取数据;

        Exclusive(x) Locks:允许持有锁的事务插入,更新或修改数据;

如果事务T1在r记录上持有s锁,这个时候事务T2申请对r加锁,锁的处理方式有以下两种:

  1.      如果T2申请获取r记录的s锁,T2会立即获取s锁,这时T1和T2都有r记录的s锁;
  2.      如果T2申请获取r记录的x锁,此时T2会等待获取x锁;

注意:如果T1持有r记录的x锁,这时T2事务申请r记录任何类型(包括s锁和x锁)的锁都需要等待T1释放r记录的x锁。

 

Record Locks

记录锁作用于索引记录(行)上。例如:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;任何事务要求对c1 = 10这条记录进行插入,更新或删除,都会立即阻塞。

record lock只会对索引记录进行加锁(index record),即使表中不存在任何索引(包括primary key)。这时MySQL会默认的给table创建聚合锁(clustered index),并且给行记录进行加锁的时候会使用它。

当使用 SHOW ENGINE INNODB STATUS语句时会展示如下信息

请注意这句:locks rec but not gap; 证明这是Record locks 而不是 gap locks

 

Gap Locks

间隙锁,间隙锁作用于索引行区间,要么作用于索引行之前的数据或索引行后的数据。举个例子:SELECT a1 FROM t WHERE a1 BETWEEN 1 and 10 FOR UPDATE;不管在t.a1这一列上是否存在5这个值,都会阻止其他事务将5这个值插入到t.a1这一列,因为在1到10这个范围的所有行,都已经被加锁。

gap适用于单列索引,多列索引或者NULL值列。

Gap Locks在性能和并发上做出了平衡,在有些事务隔离级别(transaction isolation level)(例如REPEATABLE_READ)上起作用,在另一些上不起作用(例如READ_COMMITED)。

Gap Locks不适用于唯一索引(unique index),在唯一索引记录上,只会使用index-record lock。例如下面的语句:

SELECT * FROM T1 WHERE id = 10;如果id这一列添加了唯一索引,这种情况下,只会对id = 10这条记录使用index-record lock;如果id未使用索引或者加了非唯一索引,则会将id = 10前面的gap(间隙)加锁。

不同事务可以在同一个gap(间隙)中持有互不兼容的锁,这不足为奇。例如事务A在C-gap中持有S锁,同时事务B在C-gap中持有X锁。原因是如果某一行记录被排除在索引范围外,不同事物对相同记录持有的间隙锁必须合并。

InnoDB里面的Gap Locks仅仅是为了防止其他事务在同一个gap中进行插入(insert).Gap Locks可以并存,意味着不同事务可以在同一个gap中进行加锁而互不影响,不论是S Gap Locks和X Gap Locks。

当事务隔离级别是READ_COMMITED或者innodb_locks_unsafe_for_binlog 是启用状态时,Gap Locks可以被禁用。这种情况下,Gap Locks仅仅用来做外键约束检查或重复键检查。同时,在Mysql评估WHERE后面的查询条件后,不匹配的记录中的锁会被立即释放(REPEATABLE_READ隔离级别下,不匹配的记录也会加锁,直到所有记录遍历完毕)。对于UPDATE语句,Mysql会执行semi-consistent read(我的理解是半一致读),这种查询会返回最新提交的数据库记录,用来检查加锁记录是否满足UPDATE语句中的WHERE条件。

 

Next-Key Locks

next-key lock将index-record lock和gap lock结合起来,其中gap lock对index-record前的记录进行加锁。如果一个会话在索引记录R上持有X锁或者S锁,此时不允许其他会话在R记录前的索引记录中(也就是R记录前的gap中)插入数据。

假设一个索引包含值10,11,13,20。这个索引上有可能使用到的next-key lock包含下面几个区间,括号代表开区间,中括号代表闭区间:

       (negative infinity, 10]

       (10, 11]

       (11, 13]

       (13, 20]

       (20, positive infinity)

在最后一个区间中,next-key lock对大于20的值进行加锁,supremum(最小确定边界)的值大于索引中实际上的最大值(我理解此处是21)。最小确定边界不是真实的索引记录,此时gap的范围为大于20的任意值。

InnoDB默认的事务隔离级别为REPEATABLE_READ,此时使用next-key lock可以防止Phantom Rows(也许翻译为幽灵记录好理解些)的发生。

使用 SHOW ENGINE INNODB STATUS查询,在控制台中会显示以下信息:

 

Insert Intention Locks

插入意向锁是gap locks的一种,在插入行记录的时候会在等待X锁前使用该锁。此种锁会通知其他事务当前事务在gap中的插入位置,这样如果多个事务在同一个gap中插入记录,但是它们插入的位置不同(例如id = 1, id = 2,gap[1-8])时,事务间不需要互相等待,即可直接插入。

假设有这样一张A表,id这一列为主键,该表目前存在记录(1,2,3,6),如下图:

这时,客户端A执行下图的语句:

START TRANSACTION;SELECT * FROM t_trx_test2 WHERE id > 3 FOR UPDATE;

客户端B执行下图语句:

START TRANSACTION;INSERT INTO t_trx_test2 (id, name, code) VALUES (4, '4', '4')

使用SHOW ENGINE INNODB STATUS便会得到如下结果:

LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 3047, OS thread handle 139674939606784, query id 462305 223.73.227.90 l8dev update
INSERT INTO t_trx_test2 (id, name, code) VALUES (4, '4', '4')
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 476 page no 3 n bits 80 index PRIMARY of table `jboot-b2c`.`t_trx_test2` trx id 167318 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 6; compact format; info bits 00: len 4; hex 80000006; asc     ;;1: len 6; hex 000000026b0b; asc     k ;;2: len 7; hex bb000001310110; asc     1  ;;3: len 1; hex 36; asc 6;;4: len 1; hex 36; asc 6;;5: len 1; hex 36; asc 6;;

 

AUTO-INC LOCKS

AUTO-INC LOCKS是一种表级别锁,当一个表格中存在AUTO_INCREMENT列,事务尝试在该表中插入记录时,会使用该中特殊的表级别锁。最简单的场景是,当A事务试图在该表中插入记录时,其他试图在该表中插入记录的事务必须等待A事务,以使A事务插入的记录获得连续的主键。

 innodb_autoinc_lock_mode这个设置控制了Mysql使用何种算法进行auto-increment lock,在AUTO_INCREMENT列上插入时,让你在列最大并发插入的性能和获取连续可预测的序列上做出取舍。

 


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

相关文章

MySql InnoDB锁类型

MySql InnoDB锁类型 从类型上来分类,InnoDB存储引擎实现了两种标准的锁 共享锁(S-Lock):允许事务读一行数据 排它锁(X-Lock):允许事务删除或者更新一行数据 如果一个事务获取了S锁,那么其他事务也可以立即获得S锁,…

锁的分类总结

锁的分类是从不同角度去看的。同一个锁也可以同时属于多种类型。 一、乐观锁与悲观锁 1. 互斥同步锁的劣势 阻塞和唤醒会带来性能的劣势 用户态和核心态切换上下文切换检查是否有被阻塞线程需要被唤醒等等 可能出现永久阻塞的问题:持有锁的线程永久阻塞了&#…

锁的介绍和分类(轻量级锁 重量级锁 偏向锁 自旋锁 互斥锁)

目录 公平锁 非公平锁 非公平锁 公平锁 可重入锁 不可重入锁 可重入锁(递归锁) 不可重入锁 轻量级锁 重量级锁 偏向锁 重量级锁 自旋锁(循环上锁) 轻量级锁 轻量级锁的释放 偏向锁 自旋锁和互斥锁 自旋锁 互斥锁 为何要使用自旋锁 自旋…

最全锁种类

你可能听说过很多锁,也看到过很多文章讲解锁,这篇我在这里将对锁的不同分类进行描述锁的设计 互斥锁–共享锁 互斥锁:顾名思义,就是互斥的,意思就是当前同步代码块只能被一个线程访问,sync、reentrantlock、…

锁的类型有哪些

锁的类型有哪些 基于锁的属性分类:共享锁、排他锁。 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎 )、记录锁、间隙锁、临键锁。 基于锁的状态分类:意向共享锁、意向排它锁 共享锁(Share Lock) 共享锁又称读锁&…

Kettle使用教程之Job使用

1、Kettle的Job使用十分简单,这里也只是演示比较简单的操作,创建Job 2、点击转换,然后点击浏览,选择转换对象 3、执行按钮,运行该转换 4、如果需要长期的进行定时转换,可以在Job中的start控件进行配置 转载…

Kettle使用教程之数据同步

Kettle使用教程之数据同步 数据模型原型如下: 1、表输入,针对最新的数据输入的表 2、目标表,需要更新的表 3、两个表都需要进行排序操作 4、合并,根据id进行合并 5、数据同步(包括更新、插入、删除) 6、点击运行,就可…

ETL开发工具KETTLE使用教程

Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录。若存在,则更新。 Kettle简介:Kettle是一款国外开源的ETL工具&#xff0…

ETL工具Kettle使用教程

Kettle使用教程之数据同步 数据同步标识字段 标志字段的值有4种,分别是: “Identical” : 关键字段在新旧数据源中都存在,且域值相同 “changed” : 关键字段在新旧数据源中都存在,但域值不同 “new” : 旧数据源中没有找到该…

Kettle使用教程(一)—— 在MacOS系统中安装 Kettle

Kettle使用教程(一)—— 在MacOS系统中安装 Kettle 一、环境准备二、下载并启动Kettle二、初始化资源库 一、环境准备 Kettle 9.2JDK 1.8 (安装指引)Mysql(安装指引) 二、下载并启动Kettle 首先到官网下…

Kettle使用教程(问题)

关于kettle的介绍此文不做介绍 笔者电脑环境 winoraclejdk1.8kettle7.1 1. 考虑到在在官网下载速度比较慢,在这里可以使用国内的镜像 国内镜像 2. 配置java环境 (1) kettle需要以来java环境,因为没有安装java环境的朋友请移步配置java环境&#xff…

R-P-Faster R-CNN day65 读论文:高分辨率遥感影像综合地理空间目标检测框架

An Efficient and Robust Integrated Geospatial Object Detection Framework for High Spatial Resolution Remote Sensing Imagery 1. Introduction3. Overview of the Proposed R-P-Faster R-CNN Framework3.1. 有效集成区域建议网络与目标检测Faster R-CNN框架3.1.2. RPN与…

多特征融合的高分辨率遥感图像海陆分离——刘思彤

论文阅读笔记 摘要 为解决目前大多数海陆分离方法仅利用单一特征对图像进行处理,从而导致误分割或存在大量孤立区域,造成后续处理工作难度大或无法开展的问题,提出一种联合灰度、梯度和纹理等多特征的海陆分离方法。针对不同的陆地类型选用…

从实现的技术手段细数:高分辨率遥感影像+人工智能的现在和未来

【转自】http://baijiahao.baidu.com/s?id1601901487917871613&wfrspider&forpc 人工智能不可阻挡地向各行业渗透。这一现象,恰巧撞上了“商业遥感卫星发射潮”。这似乎预示了某种潜流。此刻,从事卫星遥感影像解译和大数据提取的专业人士、科研…

高分辨率光学遥感影像舰船目标检测与识别算法研究(尹莹莹)

论文阅读笔记 摘要 本文主要研究海陆背景下的光学遥感图像舰船目标检测与识别技术,重点研究了海陆分离、舰船目标疑似区域检测技术与疑似区域目标识别技术。 海陆分离: 采用了OTSU与形态学相结合的方法实现海路区域初步划分;再以孤立区域内…

基于高分辨率影像的潍坊大棚遥感提取

1 背景 朋友,当你坐在经过潍坊的火车上的时候,是否被窗外的风景震惊过?那一望无际的大棚,像一片海洋,又像一片草原,连接天际,一眼望不到边。在卫星地图上,白茫茫一片,蔚为…

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

目录 一.引言 二、高分辨率的地图数据源简介 1.Google Earth影像 2.Esri World Image 3.天地图 4.必应地图 5.高德地图 三、浏览与下载该地图源 1.Google Earth影像浏览与下载​ 2.Esri World Image的浏览与下载 3.天地图瓦片地址浏览与下载 4.必应地图浏览与下载 …

学习笔记-基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day2

高分辨率遥感图像语义分割-day2 摘要一、引言二、方法2.1 对比学习2.2 全局风格与局部匹配对比学习网络(GLCNet)2.2.1 全局风格对比学习模块:2.2.2局部匹配对比学习: 三、实验和结果A. 数据说明B. 实验设置1 基线:2 评…

基于全局和局部对比自监督学习的高分辨率遥感图像语义分割day3 - 网络结构

基于全局和局部对比自监督学习的高分辨率遥感图像语义分割day3 - 网络结构 前言自监督学习部分语义分割细调部分总结 前言 想要学习一个网络,最重要的就是网络结构和损失函数,一个讲了网络是怎么学,一个讲了网络将会学成什么样(个…

paddlepaddle打比赛之高分辨率遥感影像建筑物变化检测

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>> 1 赛事背景 城市是人类生活、生产的主要场所,在社会经济活动中处于重要位置。经济发展、人口增长和城市化进程的加快导致了城市地区的急剧变化,准确及时地识…