广告
返回顶部
首页 > 资讯 > 数据库 >Mysql MVCC机制原理详解
  • 163
分享到

Mysql MVCC机制原理详解

MysqlMVCCMVCC机制原理 2022-05-25 21:05:56 163人浏览 独家记忆
摘要

什么是mvcC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事

什么是mvcC

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

我们知道,一般情况下我们使用Mysql数据库的时候使用的是Innodb存储引擎,Innodb存储引擎是支持事务的,那么当多线程同时执行事务的时候,可能会出现并发问题。这个时候需要一个能够控制并发的方法,MVCC就起到了这个作用。

mysql和事务隔离级别

在理解MVCC机制的原理之前,需要先理解Mysql的锁机制和事务的隔离级别,抛开MyISAM存储引擎不谈,就Innodb存储引擎来说,分别有行锁和表锁两种锁,表锁就是一次操作锁住整张表,这样锁的粒度最大,但是性能也最低,不会出现死锁。行锁就是一次操作锁住一行,这样锁的粒度小,并发度高,但是会出现死锁。

Innodb的行锁又分为共享锁(读锁)和排它锁(写锁),当一个事务对某一行加了读锁时,允许其他事务对这一行进行读操作,但是不允许进行写操作,也不允许其他事务对这一行执行加写锁,但是可以加读锁。

当一个事务对某一行加了写锁时,不允许其他事务对这一行进行写操作,但是可以读,同时不允许其他事务对这一行加读写锁。

下面来看一下Mysql的事务隔离级别,分为以下四种:

  1. 读未提交:一个事务可以读到其他事务还没有提交的数据,会出现脏读。举个例子,有一张工资表,事务A先开启,然后执行查询id为1的员工的工资,假设此时的工资为1000,此时,事务B也开启,执行了更新操作,将id为1的员工工资减少了100,但是并未提交事务。此时再执行事务A的查询操作,可以读到事务B已经更新的数据,如果此时事务B发生回滚,事务A读到的就是“脏”数据。当事务A执行更新操作的话还可能产生幻读的情况。
  2. 读已提交:一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值。还是同样的例子,这次的事务隔离级别为读已提交的情况下,事务B不提交事务的情况下,事务A无法读到事务B更新后的数据,也就避免了脏数据产生。但是,当事务B提交之后,事务A再执行相同的数据,会发现数据变了,这就是所谓的不可重复读,意思就是同一个事务中多次执行相同的查询得到的结果不一致,同时,幻读的情况还是存在。
  3. 可重复读:一个事务第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据,这就是可重复读,这种隔离级别解决了不可重复,但是还是会出现幻读。
  4. 串行化:这种隔离级别因为对同一条记录的操作都是串行的,所以不会出现脏读、幻读等现象,但是这也就不是并发事务了。

Mysql的undo log

MVCC底层依赖Mysql的undo log,undo log记录了数据库的操作,因为undo log是逻辑日志,可以理解为delete一条记录的时候,undo log会记录一条对应的insert记录,update一条记录的时候,undo log会记录一条相反的update记录,当事务失败需要回滚操作时,就可以通过读取undo log中相应的内容进行回滚,MVCC就利用到了undo log。

MVCC的实现原理

MVCC的实现,利用到了数据库的隐式字段,undo log和ReadView。首先来看隐式字段,其实mysql在表中的每行记录的后面,都隐式的记录了DB_TRX_ID(最近修改(修改/插入)事务ID),DB_ROLL_PTR(回滚指针,指向这条记录的上一个版本),DB_ROW_ID(自增ID,如果数据表没有主键,则默认以此ID简历聚簇索引)这几个隐藏的字段。

undo log分为两种,分别为insert undo log,在insert新记录时产生的undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃,还有update undo log,事务在进行update或delete时产生的undo log; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除。MVCC利用到的是update undo log。

实际上undo log记录的是一个版本链,假设数据库中有一条记录如下:

现在有一个事务A修改了这条记录,把name改为tom,这个时候的操作流程为:

  • 事务A首先对该行记录加上行锁
  • 然后将该行记录拷贝到undo log中,作为一个旧的版本
  • 拷贝完之后将该行name修改为tom,然后将该行的DB_TRX_ID的值改为事务A的id,此时假设事务A的id为1,将该行的DB_POLL_PTR指向拷贝到undo log的那条记录
  • 事务提交后,释放锁

此时的情况如下:

此时又有一个事务B来修改这条记录,把age改为28,这时候的操作流程为:

  • 事务B对改行记录加上行锁
  • 将该行记录拷贝到undo log中,作为一个旧的版本,此时发现undo log已经有记录了,那么新的一条undo log作为链表的表头插入到该行记录的undo log的最前面
  • 拷贝完后将该行的age改为28,然后将该行的DB_TRX_ID的值改为事务B的id,此时假设事务B的id为2,将该行的DB_POLL_PTR指向拷贝到undo log的那条记录
  • 事务提交后释放锁

此时的情况如下:

从上面我们可以看到,不同的事务或者相同的事务对同一行记录进行的修改,会使得该行记录的undo log形成一个版本链,undo log的链首就是最近一次的旧记录,而链尾就是最早一次的旧记录。

现在我们来假设一种情况,先假设事务A和事务B都没有提交,这时候有一个事务C,修改了name为tom的记录,把age改成了30,然后把事务提交,事务C的id为3,同样的,会插入一条记录到undo log中,此时的undo log版本链链首记录的DB_TRX_ID为3。

现在有一个事务D,查询name为tom的记录,此时将会启用快照读,快照是事务开始由查询操作触发的一个数据快照,不加锁的读在可重复读隔离级别下默认就是快照读,相对于快照读还有一个叫做当前读,更新操作都是当前读。在快照读时会产生一个读视图(Read view),在该事务执行快照读的那一刻,会生成数据库当前的一个快照,记录并且维护当前活跃的事务的ID,因为事务的ID都是自增的,所以越新的事务ID越大。读视图遵循可见性算法,而是否可见则需要做一些判断,读视图中除了记录当前活跃的事务ID以外,还记录了当前创建的最大事务ID,快照读时需要和Read view做比较来获得可见性结果。

Read view主要是把当前事务的ID,和系统中的活跃事务的ID作比较,比较的规则如下:

首先,Read view中会有一个Read view生成时刻系统中活跃的事务ID的数组,暂称为id_list

然后Read view中会记录一个id_list中最小的事务ID,暂称为low_id

最后Read view中还会记录一个Read view生成时刻系统中尚未分配的事务ID,也就是当前最大的事务ID+1,暂称为high_id

  • 当前事务ID如果小于low_id,则当前事务可见
  • 当前事务ID如果大于high_id,则当前事务不可见
  • 当前事务大于low_id小于high_id,再判断是否在id_list中,如果在,说明活跃的事务还没提交,当前事务不可见,但是对于活跃的事务本身可见,如果不在id_list中,则当前事务可见

如果可见性结果为不可见的话,需要通过DB_ROLL_PTR到undo log中取出该记录的DB_TRX_ID进行比较,通过遍历版本链,直到找到满足特定条件的DB_TRX_ID, 那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新老版本。

以上就是Mysql MVCC机制原理详解的详细内容,更多关于Mysql MVCC机制原理的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Mysql MVCC机制原理详解

本文链接: https://www.lsjlt.com/news/10289.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql MVCC机制原理详解
    什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事...
    99+
    2022-05-25
    Mysql MVCC MVCC机制原理
  • mysql mvcc 原理详解
    前言 很多人在谈起mysql事务的时候都能很快的答出mysql的几种事务隔离级别,以及在各自隔离级别下产生的问题,但是一旦谈到为什么会产生这样的结果时会觉得难以回答,说到底,还是对底层的原理未做深入的探究,本篇将从较为底层的原理层面来聊聊...
    99+
    2023-09-17
    mvcc mysql mvcc原理 mvcc 原理详解 mysql mvcc说明 mysql mvcc详解
  • mysql中的mvcc 原理详解
    目录简介前言一、mysql 数据写入磁盘流程二、redo log1、redolog 的整体流程 2、为什么需要 redo log三、undo log1、undo&...
    99+
    2022-11-13
    mysql mvcc 原理 mysql mvcc 
  • MySQL中MVCC机制的实现原理
    目录前言什么是当前读和快照读?MVCC的实现原理前言 MVCC全称为Multi Version Concurrency Control,直译为多版本并发控制,是MySQL中一种并发控制的方法,他主要是为了提高数据库的读写...
    99+
    2022-08-10
    MySQL中MVCC机制实现 MySQL的MVCC机制
  • 说说MySQL中MVCC机制的原理
    目录一、概述:二、什么是Undo log三、行的隐藏列四、Undo log版本链五、关于ReadViewReadView包含以下几个重要的参数:一、概述: 了解了mysql的底层架构后,我们今天要深入了解下什么是MVCC...
    99+
    2023-04-24
    MySQL MVCC机制实现 MySQL的MVCC机制
  • 【MySQL】MVCC详解与MVCC实现原理(MySQL专栏启动)
    📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性...
    99+
    2023-09-06
    mysql java 数据库 MVCC 事务
  • Mysql中MVCC机制的原理是什么
    这篇文章将为大家详细讲解有关Mysql中MVCC机制的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Mysql的锁和事务隔离级别在理解MVCC机制的原理之前,需要先理解Mysql的...
    99+
    2023-06-14
  • mysql 锁机制与原理详解
    前言 不管是数据库,还是很多后端编程语言,都存在锁的机制,锁的存在有效解决了并发情况下对共同资源的抢占,保证了数据的稳定性和一致性,在mysql中,锁是如何工作的呢?其底层的工作原理是怎样的呢?本篇将详细介绍下mysql锁的机制。 mys...
    99+
    2023-09-16
    mysql 锁原理 mysql 锁机制 mysql 锁使用
  • 详解MySQL多版本并发控制机制(MVCC)源码
    目录一、前言二、MVCC(多版本并发控制机制)2.1、Repeatable Read2.2、Read Commit2.3、MVCC的优势三、MVCC(实现机制)3.1、select运行栈3.2、read_v...
    99+
    2022-05-22
    MySQL MVCC MySQL 并发控制
  • 深入理解MySQL中MVCC与BufferPool缓存机制
    目录一、MVCC机制undo日志版本链与read-view机制版本链比对规则二、BufferPool机制三、总结一、MVCC机制 MVCC(Multi Version Concurr...
    99+
    2022-11-13
  • 如何理解和应用MySQL MVCC 原理
    如何理解和应用MySQL MVCC 原理引言:MySQL是一种常用的关系型数据库管理系统,它采用了MVCC(Multi-Version Concurrency Control)原理来保证数据的一致性和并发性。MVCC是一种事务并发控制方法,...
    99+
    2023-10-22
  • MySQL多版本并发控制MVCC底层原理解析
    目录1 事务并发中遇到的问题1.1 脏读1.2 不可重复读1.3 幻读2 隔离级别3 版本链4 ReadView4.1 ReadView 定义4.2 访问控制4.3 再谈隔离4.3....
    99+
    2022-11-12
  • MySQL多版本并发控制MVCC详解
    目录1.什么是MVCC2快照读与当前读2.1 快照读2.2当前读3.复习3.1 再谈隔离级别3.2 隐藏字段、Undo Log版本链4、MVCC实现原理之ReadView4.1什么是ReadView4.2 设计思路4.3...
    99+
    2022-07-25
    MySQL多版本并发控制MVCC MySQL MVCC
  • 深入解析MySQL MVCC 原理与实现
    深入解析MySQL MVCC 原理与实现MySQL是目前最流行的关系型数据库管理系统之一,它提供了多版本并发控制(Multiversion Concurrency Control,MVCC)机制来支持高效并发处理。MVCC是一种在数据库中处...
    99+
    2023-10-22
    原理 MySQL mvcc
  • 一文解析MySQL的MVCC实现原理
    目录1. 什么是MVCC2. 事务的隔离级别3. Undo Log(回滚日志)4. MVCC的实现原理4.1 当前读和快照读4.2 隐藏字段4.3 版本链4.4 Read View(读视图)5. 不同隔离级别下可见性分析...
    99+
    2022-08-16
    MySQL的MVCC实现原理 MySQL的MVCC实现
  • Mysql InnoDB多版本并发控制MVCC详解
    目录一丶为什么需要事务隔离级别1.实现事务隔离的方式:串行执行2.实现事务隔离的方式:可串行执行二丶并发事务执行的问题:脏写,脏读,不可重复读,幻读1.脏写2.脏读3.不可重复读4.幻读三丶隔离级别1.Read UnCo...
    99+
    2022-11-29
    MySQLMVCC多版本并发控制 mysql的MVCC mysqlmvcc原理
  • Android Handler机制详解原理
    Looper是整个跨线程通信的管理者 // 内部持有的变量如下: ThreadLocal<Looper> MainLooper Obs...
    99+
    2022-11-12
  • MySQL索引机制的详细解析及原理
    目录一.索引的类型与常见的操作二.常见的索引详解与创建三.索引的原理1.通过实验介绍B+tree2.延伸四.聚簇索引和非聚簇索引1.使用聚簇索引的优势2.什么情况下无法使用索引总结一...
    99+
    2022-11-13
  • MySQL MVCC 原理详解及其对数据库性能的影响
    MySQL是一个开源的关系型数据库管理系统,广泛应用于Web应用程序的开发中。其中一个重要的特性就是MVCC(Multi-Version Concurrency Control,多版本并发控制)机制。本文将详细解析MySQL中MVCC的原理...
    99+
    2023-10-22
    性能 MySQL mvcc
  • MySQL复制优点、原理详解
    复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。MySQL可以从一台主库同时向多台从库进行复制,从库同时也可以作为其他从库的主库,实现链式复制...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作