Mysql的MVCC机制解读

 更新时间:2025年08月05日 09:54:45   作者:zhifeng687  
MySQL InnoDB通过隐藏列(DB_TRX_ID、DB_ROLL_PTR)记录事务ID与回滚指针,结合ReadView判断数据可见性,利用回滚段存储旧版本数据,实现MVCC机制,提升并发性能并保障数据一致性与隔离性

Mysql的MVCC机制

MySQL的MVCC机制主要通过以下几个关键要素来工作:  

数据版本与隐藏列 

  • MySQL InnoDB存储引擎会在每行数据中添加几个隐藏列,用于实现MVCC。其中包括 DB_TRX_ID 列,记录最后一次修改该行数据的事务ID;
  • DB_ROLL_PTR 列,指向该行数据的回滚段指针,通过它可以找到之前版本的数据。  

事务版本号 

  • 每个事务在启动时都会被分配一个唯一的事务版本号,这个版本号是递增的。
  • 事务对数据的修改会创建新的数据版本,并将事务版本号记录在 DB_TRX_ID 列中。  

Read View(读视图) 

  • 当事务进行读取操作时,会创建一个Read View。Read View中包含了当前系统中活跃的事务列表、最小的活跃事务ID、最大的事务ID等信息。
  • 事务在读取数据时,根据Read View中的信息来判断数据版本的可见性。如果数据版本的 DB_TRX_ID 小于Read View中的最小活跃事务ID,说明该版本是在所有活跃事务之前提交的,对当前事务可见;如果 DB_TRX_ID 大于Read View中的最大事务ID,说明该版本是在当前事务启动之后创建的,对当前事务不可见;如果 DB_TRX_ID 在活跃事务列表中,说明该版本是由活跃事务创建的,对当前事务不可见。  

回滚段 

  • 回滚段用于存储数据的旧版本。
  • 当事务对数据进行修改时,InnoDB会将修改前的数据复制到回滚段中,以便在需要时进行回滚操作,或者提供给其他事务根据MVCC规则进行读取。

通过这些要素的协同工作,MVCC机制使得不同事务在并发访问数据时,能够看到各自一致的数据视图,提高了数据库的并发性能,同时保证了数据的一致性和隔离性。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • .Net Core导入千万级数据至Mysql的步骤

    .Net Core导入千万级数据至Mysql的步骤

    最近在工作中,涉及到一个数据迁移功能,从一个txt文本文件导入到MySQL功能。数据迁移,在互联网企业可以说经常碰到,而且涉及到千万级、亿级的数据量是很常见的。今天我们就来谈谈MySQL怎么高性能插入千万级的数据。
    2021-05-05
  • mysql事件的开启和调用

    mysql事件的开启和调用

    这篇文章主要介绍了mysql事件的开启和调用,需要的朋友可以参考下
    2015-01-01
  • MySQL去重中distinct和group by的区别浅析

    MySQL去重中distinct和group by的区别浅析

    今天无意中听到有同事在讨论,distinct和group by有什么区别,下面这篇文章主要给大家介绍了关于MySQL去重中distinct和group by区别的相关资料,需要的朋友可以参考下
    2022-11-11
  • 深入理解MySQL默认事物隔离级别

    深入理解MySQL默认事物隔离级别

    本文主要介绍了深入理解MySQL默认事物隔离级别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • MYSQL主从不同步延迟原理分析及解决方案

    MYSQL主从不同步延迟原理分析及解决方案

    这篇文章介绍了MYSQL主从不同步延迟原理分析及解决方案,有需要的朋友可以参考一下
    2013-09-09
  • MySQL安全设置图文教程

    MySQL安全设置图文教程

    MySQL安全设置,跟mssql差不多都是以普通用户权限运行mysql。其它的也需要注意下。
    2011-01-01
  • Window中MySQL绕过密码登录的底层原理详解

    Window中MySQL绕过密码登录的底层原理详解

    在 MySQL 中,root 用户的密码存储和认证机制随着版本的升级发生了变化,绕过密码登录主要依赖于 --skip-grant-tables 选项,本文将详细分析 MySQL 绕过密码的底层原理,并解释为什么某些操作在 --skip-grant-tables 模式下无效,以及如何正确生效修改
    2025-02-02
  • Mac操作系统下MySQL密码忘记后重置密码的方法

    Mac操作系统下MySQL密码忘记后重置密码的方法

    本文给大家介绍Mac下忘记MySQL密码后重置密码的方法,下面通过关闭mysql服务器,配置短命令相关操作,完成重置密码功能,非常不错,具有参考借鉴价值,感兴趣的朋友可以参考下
    2016-06-06
  • Mysql中find_in_set()函数用法详解以及使用场景

    Mysql中find_in_set()函数用法详解以及使用场景

    前几天在sql查询的时候,想要判断数据库中表的某一列中的值是否在List集合中,接触到了find_in_set的使用,用起来方便快捷,下面这篇文章主要给大家介绍了关于Mysql中find_in_set()函数用法详解以及使用场景的相关资料,需要的朋友可以参考下
    2023-03-03
  • mysql数据插入效率比较

    mysql数据插入效率比较

    今天小编就为大家分享一篇关于mysql数据插入效率比较,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论