首页 > 数据库 >mysql MVCC 原理

mysql MVCC 原理

时间:2023-06-10 16:34:06浏览次数:48  
标签:事务 Read MVCC InnoDB mysql 原理 id View

MVCC的定义

MVCC,即多版本并发控制,是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC的目的是为了提高数据库的并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

MVCC的目的

在MySQL中,InnoDB存储引擎实现了MVCC机制,主要用于解决事务隔离级别为读已提交(Read Committed)和可重复读(Repeatable Read)下的数据一致性问题。在这两种隔离级别下,InnoDB使用快照读(Snapshot Read)来读取数据,而不是加锁读(Lock Read),从而避免了加锁带来的性能开销和死锁风险。

 

MVCC的实现原理

MVCC的实现原理主要依赖于每一行记录中两个隐藏字段,undo log,ReadView等。

那么,InnoDB是如何实现快照读的呢?这就涉及到MVCC的底层原理。在本文中,我们将介绍以下几个方面:

  • InnoDB中每行记录的隐藏列
  • InnoDB中的undo log
  • InnoDB中的Read View
  • InnoDB中的快照读算法

InnoDB中每行记录的隐藏列

在InnoDB存储引擎中,每一行记录都有两个隐藏列:trx_idroll_pointer。如果表中没有主键和非NULL唯一键时,则还会有第三个隐藏的主键列row_id

  • trx_id:记录操作该数据事务的事务ID,也就是事务版本号。每个事务开始前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。
  • roll_pointer:这个隐藏列就相当于一个指针,指向回滚段(Rollback Segment)的undo log。undo log用于记录数据被修改前的信息,在事务回滚或者快照读时需要用到。
  • row_id:单调递增的行ID,不是必需的,占用6个字节。只有在表中没有主键和非NULL唯一键时才会生成。

InnoDB中的undo log

undo log,回滚日志,用于记录数据被修改前的信息。在表记录修改之前,会先把数据拷贝到undo log里,如果事务回滚,即可以通过undo log来还原数据。

可以这样认为,当delete一条记录时,undo log 中会记录一条对应的insert记录,当update一条记录时,它记录一条对应相反的update记录。

undo log有什么用途呢?

  • 事务回滚时,保证原子性和一致性。
  • 用于MVCC快照读。

InnoDB中的Read View

Read View是InnoDB存储引擎为了实现快照读而创建的一个数据结构。它保存了当前活跃(未提交)事务列表以及当前系统最大事务ID等信息。通过Read View可以判断某个版本的数据是否对当前事务可见。

Read View包含以下几个字段:

  • creator_trx_id:创建该Read View的事务ID。
  • low_limit_id:当前系统最大事务ID+1。
  • up_limit_id:创建该Read View时活跃事务列表中最小的事务ID。
  • trx_ids:创建该Read View时活跃(未提交)事务列表。

InnoDB中的快照读算法

快照读算法是InnoDB存储引擎根据Read View和undo log来判断某个版本的数据是否对当前事务可见的算法。它的基本思路如下:

  • 如果记录的trx_id小于Read View的up_limit_id,说明该记录在Read View创建之前就已经存在,且没有被更新过,对当前事务可见。
  • 如果记录的trx_id大于等于Read View的low_limit_id,说明该记录在Read View创建之后才插入或者更新,对当前事务不可见。
  • 如果记录的trx_id在Read View的up_limit_idlow_limit_id之间,但不在Read View的trx_ids列表中,说明该记录是已提交事务更新或者插入的,对当前事务可见。
  • 如果记录的trx_id在Read View的up_limit_idlow_limit_id之间,且在Read View的trx_ids列表中,说明该记录是未提交事务更新或者插入的,对当前事务不可见。此时需要根据记录的roll_pointer指向的undo log来还原该记录的前一个版本,然后重复上述步骤,直到找到一个对当前事务可见的版本或者不存在为止。

MVCC的应用场景和限制

  • MVCC只在已提交读(Read Committed)和可重复读(Repeatable Read)两个隔离级别下工作,其他两个隔离级别和MVCC是不兼容的。
  • MVCC只适用于快照读(普通的select语句),不适用于当前读(加锁的select语句)。
  • MVCC可以解决不可重复读(同一条记录多次读取内容不一致)的问题,但不能解决幻读(同一范围多次读取结果集不一致)的问题。

MVCC的优缺点是:

  • 优点:
    • MVCC在大多数情况下代替了行锁,实现了对读的非阻塞,读不加锁,读写不冲突。
    • MVCC可以提高数据库的并发性能和数据一致性,避免了加锁带来的开销和风险。
    • MVCC可以支持多种隔离级别,如读已提交和可重复读,通过不同的Read View生成策略来实现。
  • 缺点:
    • MVCC需要额外的存储空间来保存每行记录的隐藏列和undo log。
    • MVCC需要做更多的行维护和检查工作,如遍历版本链,比较事务ID,还原数据版本等。
    • MVCC不适用于读未提交和串行化两种隔离级别,前者存在脏读问题,后者需要加锁实现。

总之,MVCC是一种并发控制的方法,利用了每行记录的隐藏列、undo log和Read View来实现快照读算法。它有利于提高数据库的并发性能和数据一致性,但也有一些额外的开销和限制。在使用MVCC时,需要根据具体的业务场景和需求来选择合适的隔离级别和事务策略。

总结

MVCC是一种并发控制的方法,用于提高数据库的并发性能和数据一致性。InnoDB存储引擎实现了MVCC机制,主要用于读已提交和可重复读两种隔离级别下的快照读。InnoDB利用每行记录的隐藏列、undo log和Read View来实现快照读算法,从而避免了加锁带来的开销和风险。

 

标签:事务,Read,MVCC,InnoDB,mysql,原理,id,View
From: https://www.cnblogs.com/shoshana-kong/p/17471496.html

相关文章

  • 本地mysql服务无法启动 解决方案
    问题引入:在我启动SQLyog时,无法连接mysql,检查MYSQL服务,并无法手动启动,由此一下是解决步骤。首先,以管理员身份打开cmd。进入到mysql的bin目录,这里需要各位去文件找找路径;在bin下,删除mysqld的所有内容;​ mysqld--remove成功:Servicesuccessfullyremoved.......
  • Python 3.x对MySQL数据库的常用操作
    首先安装MySQL,然后使用pipinstallpymysql安装扩展库,最后执行下面的代码。运行结果:公众号“Python小屋”......
  • MVCC(多版本并发控制)
    1、什么是MVCC(解决读写冲突,写都是最新版本)MVCC的实现依赖于:隐藏字段、Undolog、ReadView。    MVCC多版本并发控制,顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离几倍下执行一致性读操作有了保证。换言之,就是为了......
  • MySQL数据库安全评估工具
    MySQL数据库安全评估工具MySQLDatabaseSecurityAssessmentTool   MySAT执行多项测试以分析数据库配置和安全策略。MySAT可以帮助评估并因此提高MySQL数据库的安全性。MySAT是一个简单的SQL脚本,它易于理解,易于维护。MySAT的结果是一份HTML格式的报告。MySQL数据库安全评估......
  • 关于AWS-EC2-EBS-快照-或者AMI-创建的过程及原理
    对于AWSEC2的EBS创建快照Snapshot的原理逻辑,主要如下快照是异步制作的;时间点快照是立即创建的,但在快照完成(当所有已修改数据块都已转移到AmazonS3时)之前,其状态为 pending,很多大型初始快照或后续快照(其中的数据块已更改)可能需要几个小时才能完成。执行期间,正在进行的快照......
  • Windows桌面水印去除工具Universal Watermark Disabler原理分析及实现
    1.背景  最近做驱动开发,开启了系统测试模式,于是桌面的右下角就有一个水印,如下图:  测试了网上修改注册表方法不起作用,最后找到一款工具UniversalWatermarkDisabler可以把水印去除掉。于是对其原理有些兴趣,就有了相关的分析及编程实现。2、相关分析2.1相关行为分析  ......
  • 编译原理面试题
    1、请解释编译器前端和后端的区别,并描述它们在编译过程中的职责。编译器是将高级程序语言转换为目标机器语言的软件工具。它通常由两个主要组件组成:前端和后端。编译器前端:编译器前端主要负责源代码的分析和处理。它包括以下阶段:词法分析(LexicalAnalysis):将源代码分解成标记......
  • 如何提取DNA【原理】
    DNA提取是一种将DNA从生物样本中分离和纯化的过程。下面是一般的DNA提取步骤:选择样本:选择包含DNA的样本,可以是细胞、组织、血液、唾液、植物材料等。细胞破碎:使用物理或化学方法将细胞破碎,以释放DNA。常见的方法包括机械破碎、冻融、酶解或化学溶解。溶解蛋白质:加入蛋白......
  • docker 核心原理
    docker网络docker安装后自动创建3种网络dockernetworkls查看:bridgehost类似Vmware的NAT模式。none通过dockerinfo可见支持的网络类型:Network:bridgehostipvlanmacvlannulloverlaydocker使用Linux桥接网卡,在宿主机虚拟一个docker容器网桥(docker0),docker启动......
  • 【后端面经-数据库】MySQL的存储引擎简介
    目录MySQL的存储引擎0.存储引擎的查看和修改1.MyISAM2.InnoDB3.MEMORY4.MERGE5.总结6.参考博客MySQL的存储引擎mysql主要有四类存储引擎,目前主要使用InnoDB作为存储引擎。0.存储引擎的查看和修改查看当前数据库的默认存储引擎showvariableslike'default_storage_e......