您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MVCC多版本控制机制:MySQL事务时光机!

时间:2023-12-06 14:06:01  来源:微信公众号  作者:码农本农

多事务操作同一行数据的时候,就会出现各种并发问题,MySQL通过四种隔离级别来解决这些问题,

读未提交隔离级别是最宽松的,基本没有做隔离,所以实现起来很简单;

读提交隔离级别是每次执行语句(包括查询和更新语句)的时候都会生成一个一致性视图,从而保证当前事务可以看到其他事务提交后的数据;

可重复读隔离级别的实现是每个事务在开启的时候都会生成一个一致性视图,当其他事务有提交后也不会影响当前事务中的数据,要保证这一点mysql是通过多版本控制机制MVCC来实现的。

可串行化隔离级别的隔离级别比较高,是通过加锁来实现,所以mysql有一套锁机制。

读提交和可重复读隔离级别都是依赖于MVCC多版本控制机制实现,今天我们就来讨论mysql中的MVCC多版本控制机制

1MVCC多版本控制机制

MVCC机制是通过read-view机制与undo log版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。

undo log版本链

事务在开启的时候首先会申请一个事务id:ransaction id

事务对某行数据做修改操作的时候,Mysql会保留修改前的数据undo回滚日志,并且把事务id:ransaction id赋值给版本记录中的字段trx_id。

把这些undo log日志串联起来形成一个历史记录版本链,如图

MVCC多版本控制机制:MySQL事务时光机!

注意这里的版本记录不是真实物理存在的,真实物理存在只有最新的一条记录,其他历史记录都是通过回滚日志推导出来的。

read-view机制

可重复读隔离级别和读提交隔离级别是通过生成一个一致性视图来实现,这个一致性视图就是read-view。

一致性视图是什么

MVCC多版本控制机制:MySQL事务时光机!

一个事务启动的时候,innodb会为这个事务构造一个数组,用来保存这个事务的启动瞬间正在活跃的所有事务id。“活跃”指的是启动了,但是没提交。

数组里面id最小的值即为低水位,最大的值+1记为高水位,这便是一致性视图。

每个事务在做查询的时候会根据一致性视图的可见性规则去undo log版本链中推导对应的数据。

一致性视图的可见性规则

  1. 如果当前事务id落在绿色部分,表示这个版本是已提交的事务或者是当前事务自己生成的,这个数据是可见的;
  2. 如果当前事务id落在红色部分,表示这个版本是由将来启动的事务生成的,是肯定不可见的;
  3. 如果当前事务id落在黄色部分,那就包括两种情况:

a. 若 row trx_id在数组中,表示这个版本是由还没提交的事务生成的,不可见;

b. 若 row trx_id不在数组中,表示这个版本是已经提交了的事务生成的,可见。

2案例

MVCC多版本控制机制:MySQL事务时光机!

图中事务A查询的i是什么?我们先来分析一下。

按照从上到下事务开启的顺序,每个事务对应的一致性视图如下:

事务A的一致性视图数组[11]

事务B的一致性视图数组[11,12]

事务C的一致性视图数组[11,12,13]

事务A在查询的那个时刻,undo log版本链是:

{trx_id=11,id=1,i=10,roll_pointer=0}>>>{trx_id=13,id=1,i=11,roll_pointer=1}>>>{trx_id=12,id=1,i=12,roll_pointer=2}

“{}”  代表的是版本记录

“>>>” 代表的是回滚日志undo log

事务A在查询的时候,事务B和事务C属于未来事务,对事务A是不可见的。因此事务A查询的数据是通过最新的数据记录根据undo log不断向前回滚才得到的数据:i=10。

再看一个案例

MVCC多版本控制机制:MySQL事务时光机!

事务A查询1结果是什么?

事务A查询2结果是什么?

由一致性视图可见性规则分析,对事务A来说,事务B是未来事务,对事务A是不可见的,因此查询结果i=10。

查询2的结果i=12,为什么呢?先来看看两个概念

在可重复读隔离级别中这种通过回滚日志找到对应版本记录的读取方式就是一致性读

而不需要回滚,永远只需要读取最新版本记录的方式就是当前读

事务中如果有更新语句的话,更新语句都是以当前读的方式读取到版本记录中最新数据,然后再进行更新操作,因此上图中的查询结果为i=12。

下面两种查询方式也是当前读:

select k from t where id=1 lock in share mode;

select k from t where id=1 for update;

以上便是MVCC机制,按照其规则,这种机制只有在可重复读隔离级别和读提交隔离级别下才会有。



Tags:MVCC   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
全网最详细MVCC讲解,一篇看懂
MVCC 是一种强大的并发控制机制,在高并发环境中起着重要的作用。通过了解 MVCC 的原理和实现流程,我们可以更好地理解 MySQL 的并发控制机制,理解 MVCC 的原理对于接触 MySQL...【详细内容】
2024-01-09  Search: MVCC  点击:(71)  评论:(0)  加入收藏
MVCC多版本控制机制:MySQL事务时光机!
多事务操作同一行数据的时候,就会出现各种并发问题,mysql通过四种隔离级别来解决这些问题,读未提交隔离级别是最宽松的,基本没有做隔离,所以实现起来很简单;读提交隔离级别是每次...【详细内容】
2023-12-06  Search: MVCC  点击:(156)  评论:(0)  加入收藏
再有人问你什么是MVCC,就把这篇文章发给他
一想到并发控制,很多人第一反应就是加锁,的确,加锁确实是解决并发问题最常见的方案。但是,其实除了加锁以外,在数据库领域,还有一种无锁的方案可以来实现并发控制,那就是大名鼎鼎的...【详细内容】
2022-09-26  Search: MVCC  点击:(298)  评论:(0)  加入收藏
我对 MySQL 锁、事务、MVCC 的一些认识
单条SQL语句执行时,会被当成一个事务提交吗?以下内容摘自 《高性能MySQL》(第3版)“MySQL默认采用自动提交(AUTOCOMMIT)模式。也就是说,如果不是显式地开始一个事务,则每个查询都...【详细内容】
2020-11-04  Search: MVCC  点击:(223)  评论:(0)  加入收藏
全网最全一篇数据库MVCC详解,不全你打我
什么是MVCC全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。以下文章都是围绕InnoDB引擎来讲,因为myIsam不支持事务。同一行数据平...【详细内容】
2020-09-15  Search: MVCC  点击:(827)  评论:(0)  加入收藏
MySQL底层之MVCC、回滚段、一致性读、锁定读
你是否对MySQL数据库中的事务已经有所了解?看下面这张图,按照1~6的顺序依次执行,在RR隔离级别下,事务A和事务B各自输出的num值是多少吗? 我们预先创建好这样一张表并初始化一条数...【详细内容】
2020-09-10  Search: MVCC  点击:(268)  评论:(0)  加入收藏
MySQL 中你必须要懂的 MVCC
前言MySQL 是目前流行的开源数据库之一,各大公司都使用 MySQL 作为自家的关系型数据库,但是 MySQL 作为一个数据库而言,基本使用是非常简单的,只要会一点点建表语句(可以使用工具...【详细内容】
2020-06-28  Search: MVCC  点击:(254)  评论:(0)  加入收藏
一篇文章弄懂SpringBoot中WebMvcConfigurer(建议收藏学习)
一:简介WebMvcConfigurer是SpringBoot的一个配置类,采用JavaBean的形式来代替传统的xml配置文件形式,简化了开发中类的配置,可以自定义一些Handler,Interceptor,ViewResolver,Messa...【详细内容】
2020-06-22  Search: MVCC  点击:(1510)  评论:(0)  加入收藏
Mysql中InnoDb引擎MVCC原理详解
什么是MVCCMulti-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。MVCC有...【详细内容】
2019-09-25  Search: MVCC  点击:(626)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(5)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(10)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(8)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(23)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(5)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(26)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(41)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(50)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(53)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(82)  评论:(0)  加入收藏
站内最新
站内热门
站内头条