前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL中的MVCC概念介绍(1)

MySQL中的MVCC概念介绍(1)

作者头像
AsiaYe
发布2019-11-06 17:46:32
7180
发布2019-11-06 17:46:32
举报
文章被收录于专栏:DBA随笔
MySQL中的MVCC概念介绍(1)

Innodb是MySQL中最常用的事务型存储引擎,为了提高事务的并发性能,Innodb中实现了多版本并发控制,英文名称:Multi-Version Concurrency Control,也就是我们常说的MVCC,如果对这个概念比较模糊,可以一边看,一边理解。

所谓的多版本,其实就是一条记录拥有多个版本,例如一个用户的存款金额,如果多个事务同时对这个存款金额进行修改,一个是增加金额,一个是减少金额,还有一些只是读取这条记录的值,这种情况下,对于不同的事务,可能这条记录显示出来的值就不一样了。但是对于同一个事务,它看到的数据都是一致的。

MVCC有几个特征:

1、数据表中的每行数据都存在一个版本,每次数据更新时都更新该版本。

2、修改时Copy出当前版本随意修改,各个事务之间无干扰。

3、修改完成后,保存时比较版本号,如果成功提交(commit),则覆盖原记录;失败则放弃copy,执行回滚(rollback)

关于上面的第1点,记录是如何保存版本的,这里解释一下,在Innodb中,每一行数据中额外保存两个隐藏的列:其中一个保存了记录的创建版本号,一个保存了记录的过期版本号。每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较。

每个事务又有自己的版本号,这样事务内执行CRUD操作时,就通过版本号的比较来达到数据版本控制的目的。

下面我们先看看在RR隔离级别下,MVCC的操作步骤:

对于select

innodb会只查找版本早于当前事务版本的数据记录,也就是,行的记录要么是在事务开始前已经存在的,要么是事务自身修改过的行。

行的删除版本要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行,在事务开始之前还没有被删除。

对于insert

innodb为新插入的每一行保存当前系统版本号作为行版本号。

对于delete

innodb为删除的每一行保存当前系统版本号作为行删除标识

对于update

innodb会插入一条新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识。其实本质上是新增一个记录,然后保存一条删除记录。

保存这两个额外的系统版本号,可以使得大多数的读取操作都不用加锁了,直接从旧的版本中取数据即可,这样的设计使得读取的性能提高,并且也能保证只读取到符合条件的行,对于正在变更的事务,其实是读取不到的。这样做的不足之处是浪费了额外的存储空间,数据记录的历史版本比较多。

还有一点需要注意,MVCC只在RR和RC隔离级别下工作,关于这一点,后续将会使用例子进行说明,今天只是简单的概念介绍,有一个直观的感知即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档