深入理解Mysql中的MVCC

 更新时间:2023年09月09日 14:32:33   作者:这是一条海鱼  
这篇文章主要介绍了深入理解Mysql中的MVCC,同样的sql查询语句在一个事务 里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果, 这个隔离性就是靠MVCC机制来保证的,需要的朋友可以参考下

MVCC多版本并发控制机制

同样的sql查询语句在一个事务 里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果, 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的。

对一行数据的读和写两个操作默认 是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操 作加锁互斥来实现的。 Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。

MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。

三个隐式字段如下

隐藏字段含义
db_trx_id最近修改事务id,记录插入这条记录或最后一次修改该记录的事务id。
db_roll_ptr回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。
db_row_id隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。
  • undo log,回滚日志,在insert、update、deletel的时候产生的便于数据回滚的日志。
  • 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。
  • 而update、deletel的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。

undo log日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo log回滚日志,并且用两个隐藏字段db_trx_id和db_roll_ptr把这些undo log日志串联起来形成一个历史记录版本链

在这里插入图片描述

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

版本链数据访问规则 ①.trx_id==creator_trx_id?可以访问该版本成立,说明数据是当前这个事务更改的。

②.trx_id<min_trx_id?可以访问该版本成立,说明数据已经提交了。

③.trx_id>max_trx_id?不可以访问该版本成立,说明该事务是在ReadView生成后才开启。

④.min_trx_id<=trx_id<=max_trx_id?如果trx_id不在mids中是可以访问该版本的成立,说明数据已经提交。

readView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。 Readview中包含了四个核心字段:

字段含义
m_ids当前活跃的事务ID集合
min_trx_id最小活跃事务ID
max_trx_id预分配事务D,当前最大事务D+1(因为事务D是自增的)
creator_trx_idReadView创建者的事务D

不同的隔离级别,生成ReadView的时机不同:

  • Read committed(读已提交):在事务中每一次执行快照读时生成ReadView。
  • Repeatable Read(可重复读) :仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

总结

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

到此这篇关于深入理解Mysql中的MVCC的文章就介绍到这了,更多相关Mysql中的MVCC内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_

    这篇文章主要介绍了MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • windows无法启动MySQL服务报错1067的解决方法

    windows无法启动MySQL服务报错1067的解决方法

    这篇文章主要为大家详细介绍了windows无法启动MySQL服务报错1067的3种解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 利用MyFlash实现MySQL数据闪回的操作指南

    利用MyFlash实现MySQL数据闪回的操作指南

    MySQL数据闪回是一种高级功能,它允许你在数据库中恢复到某个特定的时间点,通常是事务开始或保存点的状态,以便处理数据错误或回滚意外更改,本文给大家介绍了如何利用MyFlash实现MySQL数据闪回,需要的朋友可以参考下
    2024-06-06
  • 详解MySQL中如何定位阻塞语句

    详解MySQL中如何定位阻塞语句

    MySQL 阻塞是指在并发访问 MySQL 数据库时,某个事务占用了资源并且长时间不释放,导致其他事务无法执行或执行缓慢的情况,那如何排查和定位阻塞语句呢,下面来分析下吧
    2023-07-07
  • Windows安装MySQL8.0.x 版本教程

    Windows安装MySQL8.0.x 版本教程

    这篇文章介绍了Windows安装MySQL8.0.x 版本的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 解压版MYSQL中文乱码问题解决方案

    解压版MYSQL中文乱码问题解决方案

    这篇文章主要介绍了解压版MYSQL中文乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • MySql安装启动两种方法教程详解

    MySql安装启动两种方法教程详解

    本文通过两种方法给大家介绍mysql安装启动的方法,非常不错,具有参考价值,有需要的朋友一起学习吧
    2016-05-05
  • Mysql中复制详细解析

    Mysql中复制详细解析

    这篇文章主要介绍了Mysql中复制详细解析,从基本概念、用途、实现方法以及集中模式进行了介绍,然后分享了具体实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 图文详解Mysql索引的最左前缀原则

    图文详解Mysql索引的最左前缀原则

    最左前缀原则是发生在复合索引上的,只有复合索引才会有所谓的左和右之分,下面这篇文章主要给大家介绍了关于Mysql索引的最左前缀原则的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Innodb表select查询顺序

    Innodb表select查询顺序

    这篇文章主要介绍了Innodb表select查询顺序的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论