Mysql-MVCC

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql InnoDB存储引擎基于Multi-Version Concurrency Control(MVCC,多版本的并发控制协议)实现。MVCC是通过保存数据在某个时间点的快照来实现的;优点是:读不加锁,读写不冲突。


Mysql InnoDB存储引擎基于Multi-Version Concurrency Control(MVCC,多版本的并发控制协议)实现。MVCC是通过保存数据在某个时间点的快照来实现的优点是:读不加锁,读写不冲突。

 

 原理

1 实现原理

InnoDB的MVCC可以是通过在每行记录中保存两个隐藏的列来实现的,创建事物id,删除事物id。开始一个新的事务,系统版本号(可以理解为事务的ID)就会自动递增,事务开始时刻的系统版本号会作为事务的ID。

Innodb最基本行记录(row中包含一些额外的存储信息:DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT

列名

长度

备注

DATA_TRX_ID

6字节

标记了最新更新这条行记录的transaction id,每处理一个事务,事物值自动+1

DATA_ROLL_PTR

7字节

指向当前记录项的rollback segment的undo log记录,找之前版本的数据就是通过这个指针

DB_ROW_ID

6字节

innodb自动产生聚集索引时,聚集索引包括这一列,否则聚集索引中不包括这个值。

DELETE BIT

 

位用于标识该记录是否被删除,这里的不是真正的删除数据,而是标志出来的删除。真正意义的删除是在commit的时候

 

2 Select

当隔离级别是REPEATABLE READ时select操作,InnoDB查询时必须保证每行数据符合两个条件:

InnoDB只查找版本号必须小于等于事务版本的数据行。这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行。

行的删除操作的版本一定是未定义的或者大于当前事务的版本号,确定了当前事务开始之前,行没有被删除。

 

3 实现

MVCC有下面几个特点(看起来有点乐观锁的味道):

a、每行数据都存在一个版本。

b、每次数据更新时都更新该版本 修改时Copy出当前版本随意修改,个事务之间无干扰。

c、保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)。

 

Innodb的MVCC实现方式如下:

a、事务以排他锁的形式修改原始数据,

b、把修改前的数据存放于undo log,通过回滚指针与主数据关联

c、修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)

 

 MVCC示例

接下来讲述在REPEATABLE READ隔离级别下,MVCC具体是如何操作的

 

1 表结构

假设存在表user,结构如下:

2cd46eb48ead102977e55d7a4a04c45bc8dad678

加上DATA_TRX_ID、DATA_ROLL_PTR、DB_ROW_ID后的结果如下:

2e9c10b88906835f32b89dd14c54586805c95314

 

2 insert

假设当前事务id=1,插入一条记录,sql如下:

insert into user value("a1")

结果数据如下:

653ec2d114308c83c33f2e4c9eea5410a64958d5

 

3 update

假设原始数据如下:

937b9979277abc370c7ecd63ca26c22ee6953382

假设当前事务id=2,更新sql如下:

update user set name="a2" where id =1;

更新时数据变动如下:

c8c8ea9cd1070c9c7737aa4e29b9fa231267bfd1

事务执行过程:

事务开始.

记录name=a1 到undo log.

修改name=a2、DATA_ROOL_PTR=UNDO LOG的记录id

记录name=a2 到redo log.

将redo log、undo写入磁盘。

事务提交

说明:如果undo log一直不删除,则会通过当前记录的回滚指针回溯到该行创建时的初始内容,所幸的时在Innodb中存在purge线程,它会查询那些比现在最老的活动事务还早的undo log,并删除它们,从而保证undo log文件不至于无限增长。

 

4   delete

假设原始数据如下:

719f9241cc76c903b6156f17169613cbd8b0ed2f

 

假设当前事务id=3,delete sql如下:

delete from user where id =1

50d23ac986b7e0d3e9839536566888bcfc002b39

事务执行过程:

事务开始.

记录原数据到undo log.

修改记录的DELETE BIT=1、DATA_ROOL_PTR=UNDO LOG的记录id

记录删除操作到redo log.

将redo log、undo写入磁盘。

事务提交

 

 

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
关系型数据库 MySQL
|
6月前
|
关系型数据库 MySQL
mysql事务隔离级别MVCC
mysql事务隔离级别MVCC
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】MVCC
多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。 MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。在 RC、RR 这两种隔离级别下生效。 在事务也提到,MVCC是保证MySQL在默认隔离级别RR情况下,针对快照读解决幻读问题。而针对当前读需要隔离锁的临键锁(记录锁+间隙锁)去解决。
203 0
|
7月前
|
存储 SQL 关系型数据库
MySQL - 深入理解 MySQL 的 MVCC 及实现原理
MySQL - 深入理解 MySQL 的 MVCC 及实现原理
499 0
|
SQL 算法 关系型数据库
到底什么是Mysql的MVCC
到底什么是Mysql的MVCC
|
存储 关系型数据库 MySQL
【MySQL面试】说说MVCC
【MySQL面试】说说MVCC
273 0
|
存储 算法 Oracle
MVCC在Mysql中的运用
MVCC在Mysql中的运用
84 0
|
存储 监控 关系型数据库
MySQL - 解读MySQL事务与锁机制
MySQL - 解读MySQL事务与锁机制
137 0
|
SQL 存储 Oracle
mysql事务 MVCC
mysql事务 MVCC
164 0
|
SQL 关系型数据库 MySQL
Mysql(六)MVCC机制
Mysql(六)MVCC机制
106 0