InnoDB中的锁

5、InnoDB的七种锁 临键锁,是记录锁与间隙锁的组合,既包含索引记录,又包含索引区间。更具体的,临键锁会封锁索引记录本身,以及索引记录之前的区间。插入意向锁,是间隙锁(Gap Locks)的一种(也是实施在索引上的),它是专门针对insert操作的。间隙锁,它封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。它会在id=1的索引记录上加锁,以阻止其他事务插入,更新,删除id=1的这一行。 阅读详情

欢迎访问原文地址来阅读最新版本
转载请注明出处:http://kang.fun/innodb-lock

一、锁的类型

Mysql可以按照粒度划分为表锁和行锁

  • 表锁范围大,上锁慢,并发低
  • 行锁仅锁索引,上锁慢,并发高

InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。

而行锁又分为排他锁和共享锁

  • 共享锁(S):允许获得该锁的事务读取数据行(读锁),同时允许其他事务获得该数据行上的共享锁,并且阻止其他事务获得数据行上的排他锁。
  • 排他锁(X):允许获得该锁的事务更新或删除数据行(写锁),同时阻止其他事务取得该数据行上的共享锁和排他锁。

表锁和行锁同时存在就会带来一个问题,如果要申请表锁的时候如何确定当前表没有行锁呢?简单的方式当然是遍历查找,但这样效率太低,所以引入了“意向锁”(intention lock)。在添加行锁之前对表添加意向锁。

slideshare上对意向锁的一段表述:

IS and IX locks allow access by multiple clients. They won’t necessarily conflict until they try to get real locks on the same rows.
But a table lock (ALTER TABLE, DROP TABLE, LOCK TABLES) blocks both IS and IX, and vice-versa.

翻译成中文:

IX(意向排他锁),IS(意向共享锁)是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,S发生冲突

除了上面提到的锁,还有一种,叫“间隙锁”。

二、InnoDB解决幻读的方式 - 间隙锁(Gap Locks)

什么是间隙锁呢?先来看看Mysql官网上的定义:

A gap lock is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.

翻译过来就是:间隙锁(Gap Lock)锁定的是索引记录之间的间隙、第一个索引之前的间隙或者最后一个索引之后的间隙。

比如,当前数据库存在这样的一张person表,id是主键,age是普通索引,即二级索引:

idnameage
1张三13
3李四14
4王五16

在事务A中有一项操作是查询id在1~3范围内的数据:

...
select * from person where id between 1 and 3
...

显而易见,应该返回张三和李四这两条数据。

但如果在事务A尚未提交时,此时另一个事务B插入一条id为2的数据,并提交成功,那么当事务A结束后,会发现查询出来的数据(2条)少于数据库当前存在的数据数量(3条),这就产生了幻读的问题。

所以InnoDB引入间隙锁,来锁住1到3中所有的数据,这样不会有其他事务影响当前事务的范围操作。

这就是间隙锁的主要、唯一目的:阻止其他事务在间隙上插入记录

为什么要锁住“第一个索引之前的间隙或者最后一个索引之后的间隙”呢?

再举个例子:

select * from person where age = '14' for update

这时如果另一个事务执行如下操作,会发现执行失败:

insert into person values(2, '赵六', 14)

这就引出另一个问题:数据间隙的分析时,优先通过二级索引排序,再通过二级索引中存储的主键排序

由于二级索引存放在B+树上,B+树的特点是不允许值重复,所以需要让主键共同参与二级索引值的构成来保证唯一性。

二级索引指向主键而不是数据地址,这样防止行移动或者数据页分裂时导致的二级索引维护工作。

所以,你的期望是锁住age为14的数据,但数据库不知道你要锁住的是14和哪个主键构成的二级索引,所以只能把id在1~3范围内的数据都锁住。

另外其间隙锁的区间是(1, 3],即大于1小于等于3。

Next-key 锁

相当于一个索引记录锁加上该记录之前的一个间隙锁。

三、Mysql数据上锁方式

1. 被动锁

对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁

2. 主动锁

  • FOR UPDATE

    增加排他锁

  • FOR SHARE

    增加共享锁

西门子S7-1200/1500 PLC编程与应用技巧 西门子S7-1200 PLC是一款紧凑型的控制器,适用于小型到中型的自动化控制任务。紧凑设计:集成了I/O模块,减少了控制柜的空间需求。高性能:高达25µs的扫描时间,能够快速响应。模块化扩展:支持扩展输入输出模块、通信模块和智能模块,满足不同的应用需求。多种编程语言:支持Ladder图(梯形图)、功能块图(FBD)、结构化文本(ST)等多种编程语言。西门子S7-1200与S7-1500 PLC是强大且灵活的工业控制系统,适用于各种自动化应用。 阅读详情

相关推荐

MATLAB新手也能懂:用MATPOWER 8.0b搞定电力系统潮流计算(附case9实战代码)

本文详细介绍了如何使用MATPOWER 8.0b在MATLAB中进行电力系统潮流计算,特别适合新手入门。通过case9实战案例,讲解了从安装配置到运行牛顿-拉夫逊法潮流计算的全过程,包括结果分析和常见问题处理,帮助读者快速掌握这一电力系统分析的核心技能。

weixin_26757925的博客 381

Mysql-(四)-mysql中的锁概述

MySQL InnoDB 锁的基本类型 释放锁有两种方式,只要事务结束,锁就会自动事务,包括提交事务和结束事务。 共享锁 Shared Locks (共享锁),我们获取了一行数据的读锁以后,可以用来读取数据, 所以它也叫做读锁。用 select … lock in share mode 的方式手工加上一把读锁。 排它锁 Exclusive Locks(排它锁),它是用来操作数据的,所以又叫做写锁...

Lcy 309

DDR核心机制解析:从Burst到Prefetch的性能跃迁

本文深入解析了DDR内存性能跃迁的核心机制,重点阐述了Burst(突发传输)与Prefetch(预取)技术的协同工作原理。Burst机制通过连续传输数据减少访问延迟,而Prefetch则通过内部预取数据提升吞吐量,两者结合完美匹配现代CPU缓存行需求,是DDR3等内存实现高效带宽的关键。

weixin_29232121的博客 135

MYSQL InnoDB的索引和锁

备注:X锁是排它锁(写锁),S锁是共享锁(读锁) mysql中每个表都有一个聚簇索引(clustered index ), 除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。 以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。...

236

七段数码管动态显示技术:分时复用与使能端优化

本文深入解析了七段数码管动态显示技术的核心原理,重点阐述了分时复用与使能端优化如何协同工作。通过利用人眼视觉暂留效应,分时复用技术以一套数据线驱动多个数码管,而合理的使能端控制则是消除鬼影、保证亮度均匀的关键。文章提供了从硬件基础到Verilog代码实战的完整指南,帮助开发者实现稳定高效的动态显示系统。

lilh34434的博客 213

微信小程序:errno: 1500104, errCode: 10008, errMsg: “writeBLECharacteristicValue:fail:system error, status

微信小程序errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOWN (239)"微信小程序调用蓝牙API,wx.writeBLECharacteristicValue()报错,微信小程序蓝牙写入错误,在开发uniapp微信小程序蓝牙通信功能时报错,蓝牙开发设备控制核心api,微信小程序调用蓝牙API “wx.writeBLECharacteristicValu

✅ 精选推荐文章 3931

InnoDB行锁是通过给索引上的索引项加锁来实现!

1、数据表结构如下:只有一个主键索引(ID) 2、先在客户端A执行下面的更新语句 START TRANSACTION; UPDATE zx_news_dtl t set t.sweb_desc='优快云' where t.ssource_name='优快云'; 3、再在客户端B执行以下的更新语句 UPDATE zx_news_dtl t set t.sauthor='...

lzzyok的专栏 2237

AutoSAR配置视频讲解:总目录

AutoSAR实验视频讲解:闪烁一颗LED实验【总目录】 欢迎大家来到雪云飞星的《AutoSAR实验视频讲解》,本专栏是一个关于AutoSAR的闪烁LED灯的实验课程,一共8节课,每节课的视频都放在文章最后,传送门如下: 前言 AutoSAR实验视频讲解:简介 EB 的Mcal配置 AutoSAR实验视频讲解:Mcal配置 DaVinci Cfg配置 AutoSAR实验视频讲解:新建DaVinci工程 AutoSAR实验视频讲解:Os配置(预计2021-3-10更新) AutoSAR实验视频讲解:检查校验报

雪云飞星的博客 2万+

Mysql锁专题:InnoDB锁概述

一 概述 InnoDB与MyISAM有两处不同: 1)InnoDB支持事务; 2)默认采用行级锁(也可以支持表级锁) 对于更新操作(UPDATE、INSERT、DELETE),InnoDB会自动给涉及到的数据集加排他锁(X);对于普通的SELECT语句,InnoDB不加任何锁(所以即使有一个线程的写操作在占用锁,不影响其他线程的读,但是如果某个线程试图加共享锁则不行)。 InnoDB的行锁模...

Lansonli(蓝深李)的博客 1078

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

结构光之相移法+多频外差的数学原理推导

‍论文:基于数字光栅投影的结构光三维测量技术与系统研究 [博]作者:李中伟 华中科技大学 2007功能:相移法:多频外差(三频N步相移法)01 相移法图1 待写入投影仪的理想N步相移条纹通常对于 步相移来说,生成第 幅条纹图像(如图1所示)的公式如下:402 Payment Required其中::背景光强:调制强度:像素点横向坐标:相移值图2 相机拍摄到的实际 N ......

3D视觉工坊 1190

MySQL-锁机制

因为在RR隔离级别下,需要解决不可重复读和幻读问题,所以在遍历扫描聚集索引记录时,为了防止扫描过的索引被其它事务修改(不可重复读问题) 或 间隙被其它事务插入记录(幻读问题),从而导致数据不一致,所以MySQL的解决方案就是把所有扫描过的索引记录和间隙都锁上,这里要注意,并不是直接将整张表加表锁,因为不一定能加上表锁,可能会有其它事务锁住了表里的其它行记录。但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差。

weixin_58482311的博客 128

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

innodb 锁

mysql version 5.7 innodb的锁 (1)共享锁和排他锁 Shared and Exclusive Locks InnoDB实现标准的行级锁,其中有两种类型的锁: 共享锁(S)和排他锁(X)。 1、共享锁(S)允许持有该锁的事务进行行读取。 2、排他锁(X)(独占锁)允许持有该锁的事务更新(Update)或删除(Delete)行。 举例: 如果事务(T1)事先持有某一行(r)的共...

qq_44776721的博客 642

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Innodb 行锁实现原理

Innodb的行锁是通过给索引的索引项加锁来实现的

程序猿进阶 2032

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL锁之InnoDB锁实战

文章目录1 问题背景2 前言3 回顾4 资源准备5 行锁5.1 产生行锁时的可重复读5.2 更新同一行记录时的锁竞争6 表锁7 间隙锁 1 问题背景 前面研究了很多锁的概念性知识,并没有很客观形象地了解发生InnoDB锁时到底会有什么现象。今天使用sql实战操作一下,看看InnoDB锁会造成什么现象。 参考自: InnoDB锁和事务模型之锁 MySQL行锁、表锁、间隙锁 2 前言 针对前面若干篇InnoDB官方文档所学的知识以及相关视频,笔者总结下关于InnoDB锁的知识。本篇博客仅供自己总.

Android_la的博客 1045

innodb锁-innodb表锁

innodb表锁:不像myisam表可以自动锁表,需要手动执行lock tables …read/write来进行锁表操作 表锁使用: 1.使用LOCK TABLES虽然可以给InnoDB加表级锁,但必须说明的是,表锁不是由InnoDB存储引擎层管理的,而是由其上一层──MySQL-Server负责的,仅当autocommit=0、innodb_table_locks=1(默认设置)时,Inn...

ignorewho的博客 616

MySql Innodb 锁

当我们使用了范围查询,不仅仅命中了 Record 记录,还包含了 Gap 间隙,在这种情况下我们使用的就是临键锁,它是 MySQL 里面默认的行锁算法,相当于记录锁加上间隙锁。可以看到先插入的情况下,相当于 id = 6 的索引已经存在了,并且添加了 id = 6 的记录锁,由于之前查询的是 id = 5,所以之前的间隙锁变成了(3,6)in share mode。插入意向锁是在插入之前,先判断插入的间隙是否存在间隙锁,如果存在则产生一个插入意向锁,去等待间隙锁的释放。间隙锁锁住的是两个索引之间的区间,

CLAY的博客 600

MySQL锁——行锁(InnoDB)

MySQL锁——行锁(InnoDB) 文章目录MySQL锁——行锁(InnoDB)简介InnoDB行锁错误使用行锁行锁升级为表锁产生间隙锁InnoDB行锁的争用情况总结 简介 InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是 采用了行级锁。 行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 事务及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元。 事务具有以下4个特性,简称为事务ACID属性。 ACID

RwTo的博客 2299

Innodb锁的类型

Innodb锁的类型 首先知道的一些点 共享/排它锁 意向锁 记录锁 间隙锁 临键锁 插入意向锁 自增锁 ps Innodb锁的类型 共享/排它锁(Shared and Exclusive Locks) 意向锁(Intention Locks) 记录锁(Record Locks) 间隙锁(Gap Locks) 临键锁(Next-key Locks) 插...

Aaron_涛 850

InnoDB Gap锁

InnoDB Gap锁 这篇文章基于大家对于数据库事务隔离级别以及数据库锁有一定的认识,然后讲一讲InnoDB的Gap锁。 事务隔离级别 数据库的事务隔离级别主要用于定义并发事务之间的相互影响,比如如A事务将一条数据的id由2修改为3但未提交,这时B事务查询该条数据,id是2还是3?事务A提交后呢? 造成这种差异的原因就是事务隔离级别,具体分为以下几种: 未提交读(Read Unc...

沙沙罗曼的专栏 1651

mysql innodb引擎什么时候表锁什么时候行锁?

mysql innodb引擎什么时候表锁什么时候行锁? InnoDB基于索引的行锁 InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁 在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键

javaman_baicun 的博客 2549

innodb 获取行锁争用情况

可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况: mysql> show status like 'innodb_row_lock%'; +-------------------------------+-------+ | Variable_name                 | Value | +--------------------------

cocoyan 的技术博客 5307

InnoDB的七种锁

参考:https://www.phpmianshi.com/?id=22 InnoDB的七种锁 1. 自增锁(Auto-inc Locks) 2. 共享/排他锁(Shared and Exclusive Locks) 3. 意向锁(Intention Locks) 4. 插入意向锁(Insert Intention Locks) 5. 记录锁(Record Locks) 6. 间隙锁(Gap Locks) 7. 临键锁(Next-Key Locks) 相关名词 |--表级锁(..

tiancityycf的专栏 549

MySQL InnoDB锁相关状态查询

用户可以使用INFOMATION_SCHEMA库下的INNODB_TRX、INNODB_LOCKS和INNODB_LOCK_WAITS表来监控当前事务并分析可能出现的锁问题。INNODB_TRX的定义如下表所示,其由8个字段组成。 trx_id:InnoDB存储引擎内部唯一的事务ID trx_state:当前事务的状态 trx_started:事务的开始时间 trx_request_lock_id:等待事务的锁ID。如果trx_state的状态为LOCK WAIT,那么该字段代表当前事务等待之前事务占用的

渺若浮尘的博客 684

InnoDB的七种锁介绍

共享/排他锁 InnoDB实现了两种标准的行级锁:共享锁(简称S锁)、排他锁(简称X锁)。 共享锁:简称为S锁,在事务要读取一条记录时,需要先获取该记录的S锁。 排他锁:简称X锁,在事务需要改动一条记录时,需要先获取该记录的X锁。 ...

我的java进阶之路 2228

MYSQL的InnoDB引擎中的锁以及在sql语句中实现对锁的控制

MySQL InnoDB存储引擎提供表级锁(共享/排他/意向锁)和行级锁(记录/间隙/临键锁),通过SELECT...FOR UPDATE等语句实现显式控制。锁行为受隔离级别和索引类型影响,如RR隔离级别默认使用临键锁防止幻读。建议通过监控系统表分析锁状态,优化事务设计避免长事务和死锁。合理选择索引和隔离级别可减少锁冲突,提升并发性能。

破烂PAN 的博客 703
上一篇: Redis基础知识
下一篇: JVM如何判断对象是否可以被回收
康志兴
博客等级 码龄14年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值