事务隔离级别和MVCC

InnoDB秒级快照原理与当前读 在之前为文章《分析事务隔离的实现》中我们提到:如果是可重复读隔离级别,事务T启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,我在介绍MySQL锁机制的文章中《探究MySQL锁机制》 的时候,一个事务要更新一... 阅读详情

脏写:如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写。

脏读:如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发生了脏读

不可重复读:事务两次读同一个数据结果却不一样。 和脏读的区别在于,脏读读到的是未提交的数据,不可重复读读到的是其他事务已经提交的数据。

幻读:两次查同一范围,查询到的数据数目不同(因为有另一事务操作)。

给这些问题按照严重性来排一下序:

脏写 > 脏读 > 不可重复读 > 幻读

4个隔离级别:

  • READ UNCOMMITTED:未提交读。

  • READ COMMITTED:已提交读。

  • REPEATABLE READ:可重复读。

  • SERIALIZABLE:可串行化。

针对不同的隔离级别,并发事务可以发生不同严重程度的问题:

  • READ UNCOMMITTED隔离级别下,可能发生脏读、不可重复读和幻读问题。

  • READ COMMITTED隔离级别下,可能发生不可重复读和幻读问题,但是不可以发生脏读问题。

  • REPEATABLE READ隔离级别下,可能发生幻读问题,但是不可以发生脏读和不可重复读的问题。

  • SERIALIZABLE隔离级别下,各种问题都不可以发生。

MySQL的默认隔离级别为REPEATABLE READ,我们可以手动修改一下事务的隔离级别。 

MVCC原理

对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列

  • trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。(事务ID并不是开启一个事务就会生成,仅当执行一条更新操作(增删改)才会生成!)

  • roll_pointer:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

每次对记录进行改动,都会记录一条undo日志,每条undo日志也都有一个roll_pointer属性(INSERT操作对应的undo日志没有该属性,因为该记录并没有更早的版本),可以将这些undo日志都连起来,串成一个链表,所以现在的情况就像下图一样:

 

 对该记录每次更新后,都会将旧值放到一条undo日志中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被roll_pointer属性连接成一个链表,我们把这个链表称之为版本链,版本链的头节点就是当前记录最新的值。另外,每个版本中还包含生成该版本时对应的事务id。

ReadView

对于使用READ UNCOMMITTED隔离级别的事务来说,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本就好了;

对于使用SERIALIZABLE隔离级别的事务来说,设计InnoDB的大叔规定使用加锁的方式来访问记;

对于使用READ COMMITTED和REPEATABLE READ隔离级别的事务来说,都必须保证读到已经提交了的事务修改过的记录,也就是说假如另一个事务已经修改了记录但是尚未提交,是不能直接读取最新版本的记录的,核心问题就是:需要判断一下版本链中的哪个版本是当前事务可见的。为此,设计InnoDB的大叔提出了一个ReadView的概念,这个ReadView中主要包含4个比较重要的内容:

  • m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。

  • min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。

  • max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。

  • creator_trx_id:表示生成该ReadView的事务的事务id。

有了这个ReadView,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:

  • 如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。

  • 如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。

  • 如果被访问版本的trx_id属性值大于或等于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。

  • 如果被访问版本的trx_id属性值在ReadView的min_trx_id和max_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本。如果最后一个版本也不可见的话,那么就意味着该条记录对该事务完全不可见,查询结果就不包含该记录。 

READ COMMITTED —— 每次读取数据前都生成一个ReadView

REPEATABLE READ —— 在第一次读取数据时生成一个ReadView

EAD COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。

关于purge

  • 我们说insert undo在事务提交之后就可以被释放掉了,而update undo由于还需要支持MVCC,不能立即删除掉。

  • 为了支持MVCC,对于delete mark操作来说,仅仅是在记录上打一个删除标记,并没有真正将它删除掉。

随着系统的运行,在确定系统中包含最早产生的那个ReadView的事务不会再访问某些update undo日志以及被打了删除标记的记录后,有一个后台运行的purge线程会把它们真正的删除掉。

MVCC在多事务同时存在时,SELECT语句找到是版本链上哪个版本,然后在找到的版本上返回其中所记录的数据的过程。(因为update一般都是最新版本,MVCC可以实现非锁定读select)

 

MySQL事务隔离级别及MVCC详解 MySQL的事务隔离级别包括SERIALIZABLE、REPEATABLE-READ、READ-COMMITTED和READ-UNCOMMITTED,每种级别在并发事务中表现出不同的数据一致性问题。SERIALIZABLE通过串行执行事务避免问题,但性能较差;REPEATABLE-READ是默认级别,保证事务内多次读取数据一致,但可能出现幻读;READ-COMMITTED允许读取已提交的数据,可能导致不可重复读和幻读;READ-UNCOMMITTED允许读取未提交的数据,可能导致脏读、不可重复读和幻读。通过 阅读详情

相关推荐

Hermes V0.10.0:官方UI几乎无Bug版

如果你还在观望Hermes,现在可能是最好的入局时机。 因为网页端来了,门槛降到了最低。 如果你已经是Hermes用户,升级就对了。 因为0.9.0的更新,值得一试。

weixin_66295112的博客 2046

数据库基础-mvcc-对数据库事务的四种隔离级别逐步加深的理解

此时,在事务B中使用 select 语句进行查询,我们发现在事务A提交之前,事务B中查询到的记录 age 一直是14,直到事务A提交,此时在事务B中查询,发现 age 的值已经是 30 了。注意:处于该隔离级别的事务A与B,如果事务A使用事务B不提交的变化作为计算的基础,然后哪些未提交的变化被事务A撤销,这就导致了大量的数据错误变化。在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。,事务A的提交影响了事务B的查询结果,这就是不可重复读,也就是读取已提交隔离级别。

weixin_43921491的博客 1321

5分钟搞定!用Coze+剪映小助手批量生成萌宠视频(附完整工作流配置)

本文详细介绍了如何利用Coze工作流与剪映小助手快速批量生成萌宠视频的完整方案。通过智能内容生成、素材处理、剪辑组装和输出适配四大模块的协同,实现5分钟内完成高质量视频制作。特别适合多宠物账号运营者,工作流支持模板切换和参数修改,大幅提升内容生产效率。

weixin_28678151的博客 389

【MySQL】根据MVCC和Read View分析事务的四种隔离级别在读写场景分别是如何体现其隔离性的

深入理解MySQL数据库的四种隔离级别。

学了就忘是正常现象 1万+

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5091

高德地图+Three.js实战:手把手教你打造数字农场3D可视化大屏(附完整源码)

本文详细介绍了如何利用高德地图JS API与Three.js技术栈,构建一个功能强大的数字农场3D可视化大屏。文章从技术选型、架构设计出发,深入讲解了坐标对齐、图层管理、性能优化等核心工程实践,并提供了完整的模块化代码示例,旨在为智慧农业及类似场景的3D地理可视化项目提供一套可复用的解决方案。

k8s6orchestrator的博客 890

MySQL事务隔离级别以及MVCC(多版本并发控制机制)

1.隔离级别: 读未提交:脏读(读取其它事务未提交的数据),不可重复读,幻读 读已提交:不可重复读(一个事务的两次读取数据出现不同的结果,主要是修改操作),幻读 可重复读:幻读(一个事务的两次读取数据出现不同的结果,主要是添加和删除操作) 可序列化:串行操作,每个读取的数据行加上共享锁 2.MVCC: 当前读:基于悲观锁的实现,读到的是最新版本的数据,且会对数据上锁 快照读:基于MVCC的实现,不会对读取的内容上锁,提高并发性能,可能会读到数据的旧版本 MVCC模型:为了实现读-写冲突不加锁,这个读就是指快

weixin_50899769的博客 383

轨迹规划——带抛物线过渡的直线插补

带抛物线过渡的直线插补

doudou2weiwei的博客 1984

每日一博 - 浅析事务隔离级别& MVCC机制

快照(Snapshot):当事务开始时,MySQL 会为其创建一个快照,快照中包含此时数据页中所有版本和对应事务ID。为避免覆盖,事务A生成新版本,并阻塞事务B的修改,等待其提交或回滚。行版本生成:事务更新数据时,会生成行的新版本,并把新版本的事务ID设置为自己的ID。其他事务只有在此事务提交后,新版本才对其可见。事务ID(Trx ID):每个事务开始时,会分配一个唯一的事务ID,用于标识事务在时间轴上的位置。事务回滚:如果事务回滚,其生成的所有新行版本都会被移除,不会对其他事务产生影响。

小工匠 1万+

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 556

GEE初学:谷歌地球引擎GEE入门指南(最新注册全流程)

本教程详细介绍了谷歌地球引擎(GEE)的注册与基础操作流程。主要内容包括:1)非商业账号注册步骤,需提供学术机构凭证和研究目的;2)Google Cloud项目创建与API激活;3)Shapefile文件上传方法及资源ID获取;4)JavaScript脚本编写与地图可视化实现。教程通过代码示例展示了两种多边形显示方式(填充和轮廓模式),并强调了GEE的云端处理优势,包括免费访问40多年卫星数据、无需本地高性能硬件等特点。整个流程从账号注册到首个地图可视化完成约需10-15分钟,适合遥感分析初学者快速入门。

此星光明博客 2141

一文带你了解MySQL之事务隔离级别和MVCC

并发的事务在运行过程中会出现一些可能引发一致性问题的现象

Multis 3837

物理信息神经网络(PINN)文献综述 —— 原理、严格推导与优化训练策略

本章系统阐述物理信息神经网络的理论基础、主要算法改进与训练策略。内容涵盖:PINN 的数学表述与残差构造;损失与梯度的逐步推导;训练困难(梯度消失/爆炸、损失幅度不平衡、频谱偏差、采样效率低等)的定量分析;四类核心解决方案(动态损失加权、梯度归一化与预条件化、自适应采样、分阶段/分域训练)的详细推导与实现要点;以及若干关键算法的伪代码与收敛性形式结论。所有涉及推导的步骤均按顺序展开,给出必要的数学依据与结论性陈述,可直接作为教学或参考章节使用。

u012133341的博客 423

MySQL事务隔离级别的实现原理MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制,是并发读写场景下,数据库层面提供的一种解决方案。读读当多个事务同时进行读取操作时,它们之间不存在资源竞争,不会产生任何问题。因为读取操作并不会对数据进行修改。读写在这种场景下,一个事务进行读取操作,另一个事务进行写入操作,可能会引发一系列数据一致性问题,如脏读(读取到其他事务未提交的数据)、不可重复读(在同一事务中多次读取同一数据结果不同)以及幻读(事务执行过程中出现新的符合条件的数据)。

weixin_45593273的博客 3341

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

事务隔离级别与MVCC

MVCC是一种用于处理数据库并发控制的技术,它通过维护数据的多个版本来实现高并发下的读操作和写操作的并发执行,从而提高数据库的并发性能,同时保证数据的一致性。总之,事务隔离级别规定了事务之间的隔离程度和数据一致性的保证级别,而MVCC是一种实现高并发下数据一致性的技术手段,它与事务隔离级别相互配合,在保证数据一致性的同时,提高了数据库的并发性能。事务隔离级别定义了一个事务与其他并发事务之间的隔离程度,它决定了一个事务对其他事务的可见性以及数据的一致性保证。

dsq_MaDing的博客 1082

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MySQL-事务(下)-MySQL事务隔离级别与MVCC

MySQL事务隔离级别与MVCC机制解析:文章深入剖析了MySQL四种事务隔离级别(读未提交、读已提交、可重复读、可串行化)及其解决的数据一致性问题,重点讲解了默认的可重复读级别。详细阐述了MVCC工作原理,包括隐藏字段、undo日志和ReadView三个关键概念,通过示例演示了版本链形成过程。最后对比了RR和RC隔离级别的本质区别——ReadView生成时机的不同,解释了RR如何避免不可重复读问题。这些核心机制共同保障了数据库在并发环境下的数据一致性和高性能。

nplplus的博客 6232

MySQL事务隔离级别和MVCC (绝对看得懂)

来自一本MySQL小册子,讲得很好,值得收藏! 为了故事的顺利发展,我们需要创建一个表: CREATE TABLE t ( id INT PRIMARY KEY, c VARCHAR(100) ) Engine=InnoDB CHARSET=utf8; 然后向这个表里插入一条数据: INSERT INTO t VALUES(1, '刘备'); ...

风的记忆 1万+

SQL_MVCC事务隔离级别

1、脏读:其实就是不满足数据库事务的隔离性,A操作还未提交时,B操作就已经读到了A操作后的数据,A而后将操作进行了回滚,那么B操作读到的数据就是错误的,读已提交的隔离级别就是用来处理脏读的问题2、不可重复读:同一个事务中,多次读取相同的数据,但是读取的结果不一致,会在本事务中产生数据不一致的问题,比如在A事务中,多次读取数据间隔中,B事务对数据进行了修改,那么A事务多次读取相同的数据就会产生数据不一致的问题,这就是不可重复读可重复读的隔离级别就是用来处理不可重复读的问题:以下是对可重复读的隔离级别的解释可重

xjdkxnhcoskxbco的博客 865

事务隔离级别和MVCC的关系

事务隔离级别和MVCC的关系

李长渊的博客 1384

mysql事务隔离级别和mvcc

文章目录前言一、事务隔离级别二、事务并发执行遇到的问题二、SQL标准中的四种隔离级别二、MySQL中支持的四种隔离级别二、MVCC原理二、版本链二、ReadView二、MVCC小结总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、事务隔离级别 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一

one 656

事务的隔离级别与MVCC

提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的ACID,不知道你有没有想过这个问题,事务有原子性、隔离性、一致性和持久性四大特性,为什么偏偏给隔离性设置了级别? 一切还得从事务说起。

跑码场 1145

[MySQL八股]事务特性、隔离级别、MVCC

这一篇内容比较多,也比较难懂,大家下去可以多消化一下。根据博主的经验,特别是MVCC这一块被问得很多,如果说不清,说得没有逻辑,在面试中肯定是会扣分。所以我们要形成自己的理解链条,能够保证在面试的高压中能够用清晰的条理去回答问题,而不是死记硬背。----本文图片与文字部分参考黑马程序员。

weixin_51282703的博客 1108

【Mysql】事务的隔离级别与 MVCC

我们知道 MySQL 是一个 C/S 架构的服务,对于同一个服务器来说,可以有多个客户端与之连接,每个客户端与服务器连接上之后,就是一个会话( Session )。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务。在事务简介的章节中我们说过事务有隔离性的特征,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。

margu_168的博客 1311
上一篇: 第七章:事务
下一篇: MySQL锁
叮叮咚咚666666
博客等级 码龄1天 13粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值