MySQL,InnoDB究竟如何巧妙实现,4种事务的隔离级别(第9讲,超硬核)

《数据库架构100讲》

9. InnoDB四种隔离级别

事务ACID特性,其中I代表隔离性(Isolation)。

什么是事务的隔离性?

隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离。

一个事务怎么会干扰其他事务呢?

咱们举例子来说明,假设有InnoDB表:

t(id PK, name);

表中有三条记录:

1, shenjian

2, zhangsan

3, lisi

case 1:读脏

事务A,先执行,处于未提交的状态:

insert into t values(4, wangwu);

事务B,后执行,也未提交:

select * from t;

如果事务B能够读取到(4, wangwu)这条记录,事务A就对事务B产生了影响,这个影响叫做“读脏”,读到了未提交事务操作的记录。

case 2:不可重复读

事务A,先执行:

select * from t where id=1;

结果集为:

1, shenjian

事务B,后执行,并且提交:

update t set name=xxoo where id=1;

commit;

事务A,再次执行相同的查询:

select * from t where id=1;

结果集为:

1, xxoo

这次是已提交事务B对事务A产生的影响,这个影响叫做“不可重复读”,一个事务内相同的查询,得到了不同的结果。

case 3:幻读

事务A,先执行:

select * from t where id>3;

结果集为:

NULL

事务B,后执行,并且提交:

insert into t values(4, wangwu);

commit;

事务A,首次查询了id>3的结果为NULL,于是想插入一条为4的记录:

insert into t values(4, xxoo);

结果集为:

Error : duplicate key!

事务A的内心OS是:你TM在逗我,查了id>3为空集,insert id=4告诉我PK冲突?

这次是已提交事务B对事务A产生的影响,这个影响叫做“幻读”。

可以看到,并发的事务可能导致其他事务:

(1)读脏;

(2)不可重复读;

(3)幻读;

InnoDB实现了哪几种事务的隔离级别?

按照SQL92标准,InnoDB实现了四种不同事务的隔离级别:

1. 读未提交(Read Uncommitted);

2. 读提交(Read Committed, RC);

3. 可重复读(Repeated Read, RR);

4. 串行化(Serializable);

不同事务的隔离级别,实际上是一致性与并发性的一个权衡与折衷。

InnoDB的四种事务的隔离级别,分别是怎么实现的?

InnoDB使用不同的锁策略(Locking Strategy)来实现不同的隔离级别。

一,读未提交(Read Uncommitted)

这种事务隔离级别下,select语句不加锁。

画外音:官方的说法是

SELECT statements are performed in a nonlocking fashion.

此时,可能读取到不一致的数据,即“读脏”。这是并发最高,一致性最差的隔离级别。

二,串行化(Serializable)

这种事务的隔离级别下,所有select语句都会被隐式的转化为select ... in share mode.

这可能导致,如果有未提交的事务正在修改某些行,所有读取这些行的select都会被阻塞住。

画外音:官方的说法是

To force a plain SELECT to block if other transactions have modified the selected rows.

这是一致性最好的,但并发性最差的隔离级别。

在互联网大数据量,高并发量的场景下,几乎不会使用上述两种隔离级别。

三,可重复读(Repeated Read, RR)

这是InnoDB默认的隔离级别,在RR下:

1. 普通的select使用快照读(snapshot read),这是一种不加锁的一致性读(Consistent Nonlocking Read),底层使用MVCC来实现,具体的原理在《InnoDB的高并发是因为MVCC(第5讲)》中有详细的描述;

2. 加锁的select(select ... in share mode / select ... for update), update, delete等语句,它们的锁,依赖于它们是否在唯一索引(unique index)上使用了唯一的查询条件(unique search condition),或者范围查询条件(range-type search condition):

- 在唯一索引上使用唯一的查询条件,会使用记录锁(record lock),而不会封锁记录之间的间隔,即不会使用间隙锁(gap lock)与临键锁(next-key lock)

- 范围查询条件,会使用间隙锁与临键锁,锁住索引记录之间的范围,避免范围间插入记录,以避免产生幻影行记录,尽量避免不可重复的读

画外音:这一段有点绕,多读几遍。

关于记录锁,间隙锁,临键锁的更多说明,详见《MySQL,InnoDB的select为什么会阻塞insert?(第8讲)》。

四,读提交(Read Committed, RC)

这是互联网最常用的隔离级别,在RC下:

1. 普通读是快照读;

2. 加锁的select, update, delete等语句,除了在外键约束检查(foreign-key constraint checking)以及重复键检查(duplicate-key checking)时会封锁区间,其他时刻都只使用记录锁;

此时,其他事务的插入依然可以执行,就可能导致,读取到幻影记录。

总结

1. 并发事务之间相互干扰,可能导致事务出现读脏,不可重复度,幻读等问题;

2. InnoDB实现了SQL92标准中的四种隔离级别;

- 读未提交:select不加锁,可能出现读脏;

- 读提交(RC):普通select快照读,锁select /update /delete 会使用记录锁,可能出现不可重复读;

- 可重复读(RR):普通select快照读,锁select /update /delete 根据查询条件情况,会选择记录锁,或者间隙锁/临键锁,以防止读取到幻影记录;

- 串行化:select隐式转化为select ... in share mode,会被update与delete互斥;

3. InnoDB默认的隔离级别是RR,用得最多的隔离级别是RC;

知其然,知其所以然。

思路比结论更重要。

==全文完==

有架构合集吗?

《流量从10万到10亿,80个架构问题》

《关于即时通讯架构的一切!》

Q4内测了一个新产品,看普通人起号能否复制:

《复盘来了,4周,人均41W+》

内测成绩不错,4周的时间人群你全网流量41W+,1月份启动二期,点击阅读原文一起参与!

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

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

相关文章

Spring Boot 自动配置原理与自定义 Starter 开发实战

Spring Boot 自动配置原理Spring Boot 自动配置的核心是通过条件化配置(Conditional)实现。当满足特定条件时,相关的 Bean 会被自动加载到 Spring 容器中。自动配置的触发依赖于 spring-boot-autoconfigure 模块中的 META-INF/spring/org.spr…

STM32CubeMX配置文件管理:项目迁移完整指南

掌握STM32项目迁移的核心钥匙:深入解析.ioc配置文件管理你有没有遇到过这样的场景?新同事刚加入团队,满怀期待地打开你的工程文件,结果发现外设全没了、时钟树乱了套;或者你在家里调试好好的代码,一换到公司…

嵌入式中SSD1306的I2C通信优化:操作指南

如何让SSD1306 OLED屏在IC上“飞”起来?实战优化全解析你有没有遇到过这种情况:明明MCU性能不差,代码逻辑也清晰,可一到刷新OLED屏幕,界面就卡顿、动画掉帧,像是被“限速”了一样?如果你用的是S…

工控HMI面板电路图详解:系统学习布局逻辑

工控HMI面板电路图详解:从零读懂硬件设计逻辑你有没有遇到过这样的场景?手握一块工控HMI的PCB板,密密麻麻的走线、层层叠叠的元器件,却不知从何看起?想改个引脚却发现信号“飞”到了板子另一端,调试时屏幕花…

全场景防护下的国内文档安全厂商:技术演进与竞争格局解析

在数字化转型纵深推进与数据安全法规体系持续完善的双重驱动下,文档作为企业核心数据的主要载体,其安全防护已从单一加密需求,升级为覆盖“创建-流转-存储-销毁”全生命周期、适配多终端多环境的全场景管控需求。2025年,国内文档安…

Keil MDK中实现CAN总线控制的深度剖析

在Keil MDK中构建稳定可靠的CAN通信系统:从原理到实战的完整路径你有没有遇到过这样的场景?设备之间明明接好了线,代码也烧录进去了,可就是收不到CAN报文。查了波特率、确认了终端电阻、甚至换了收发器芯片,问题依旧存…

2026中国AI营销公司实力榜:不懂生成式营销如何破局?深度解析领跑者之道

在AI营销领域,原圈科技被普遍视为行业标杆。其自主研发的"智能体营销云"双引擎,在营销战略、内容创意、智能运营和资产评估等多个维度下表现突出,能为酒旅、汽车、零售等高客单价行业提供端到端的AI增长解决方案,有效破…

AI营销不懂就落后!原圈科技领跑2026实力榜,解密ROI提升300%

原圈科技在AI营销领域被普遍视为行业标杆。其通过自主研发的"智能体矩阵"与"营销云SaaS"双引擎,在战略制定、内容创意、智能投放到客户运营等多个维度下表现突出。本文将深度剖析原圈科技如何为金融、汽车、地产等行业提供端到端解决方案&#…

项目应用:工业控制板原理图设计全过程解析

工业控制板原理图设计实战:从需求到落地的全过程拆解在智能制造与工业4.0浪潮下,工业控制板早已不再是简单的“电路拼接”。它作为PLC、运动控制器、边缘网关等设备的大脑,承担着数据采集、实时控制、通信互联和安全监控的核心任务。而这一切…

基于STM32的蜂鸣器电路应用:PWM调音实战案例

蜂鸣器还能这样玩?用STM32实现电子琴级音效的实战全解析你有没有遇到过这样的场景:智能门锁验证成功,只听到一声干巴巴的“滴”;工业设备报警时,所有故障都发出同样的长鸣;儿童玩具按下按钮,永远…

RS485和RS232通信协议驱动芯片选型实战指南

RS485与RS232驱动芯片选型实战:从原理到落地的完整技术指南你有没有遇到过这样的场景?一台工业PLC通过串口连接多个温控仪表,调试时一切正常,现场部署后却频繁丢包、误码;或者一个心电监护仪的调试接口,用U…

面向本科生、研究生的AI冬令营来了!

无论你是新手还是有AI基础只要你对AI应用感兴趣,有热情欢迎你加入Datawhale AI 冬令营面向在校学生、在职从业者提供项目实践学习机会第一期正式开放报名线上活动,全程免费报名时间:2026/1/13 - 2026/1/181关于AI冬令营2026 AI 冬令营由 Data…

Python 机器人大脑构建指南:路径规划与决策算法深度解析

路径规划与决策算法概述路径规划与决策算法是机器人大脑的核心模块,涉及从环境感知到目标驱动的动态决策过程。常见方法包括基于图搜索的全局规划(如A*、Dijkstra)、局部避障算法(如动态窗口法DWA),以及结合…

VOFA+自定义面板设计手把手教程

用VOFA打造专属嵌入式调试面板:从零开始的实战指南 你有没有过这样的经历?在调试一个三相逆变器时,一边盯着示波器看波形,一边翻代码查变量,再手动调节PID参数,反复烧录、重启、观察……整个过程像在“盲调…

如何在大数据领域做好精细化数据清洗

如何在大数据领域做好精细化数据清洗:从“整理房间”到“挖掘黄金” 一、引入与连接:为什么你需要精细化数据清洗? 1. 一个让电商推荐系统“翻车”的真实故事 去年双11,某头部电商平台的推荐系统突然“抽风”:很多用户…

Arduino安装驱动手动加载步骤:项目应用实例

Arduino驱动安装实战:从手动加载到工业传感器采集的完整链路打通 你有没有遇到过这样的场景? 新买的Arduino开发板插上电脑,IDE里却死活找不到端口;设备管理器里躺着一个带黄色感叹号的“未知USB设备”;点击上传代码…

一文说清LTspice电路仿真时域分析核心要点

深入LTspice时域仿真:从原理到实战的完整指南在电子设计领域,一个再熟悉不过的场景是:你花了几周时间画好PCB、焊完板子,通电瞬间却发现输出电压震荡不止,或者负载一跳变就掉压。拆焊、改电路、再制板……一轮下来时间…

python opencv 调用 海康威视工业相机(又全又细又简洁)

安装依赖确保已安装OpenCV和hikvision官方SDK(HCNetSDK)。OpenCV可通过pip安装:pip install opencv-python海康SDK需从官网下载,解压后根据系统类型(Windows/Linux)安装驱动和库文件。初始化相机连接使用海…

完整指南:AUTOSAR架构图配置工具链使用

从零构建汽车电子系统:AUTOSAR架构图与配置工具链实战指南你有没有遇到过这样的场景?一个ECU项目刚进入集成阶段,不同团队交付的模块却因为信号命名不一致、数据类型错位、通信时序冲突而无法对接。调试数周后才发现,问题根源竟是…

STM32中HID协议通信的完整指南与配置步骤

从零构建STM32上的HID通信:不只是键盘鼠标那么简单 你有没有遇到过这样的场景?调试一块嵌入式板子,插上USB线后电脑弹出“未知设备”,提示要安装驱动。客户皱眉:“这玩意儿怎么这么麻烦?”——而隔壁同事的…