MySQL MVCC(多版本并发控制)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

概述  

为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit为1)清空undolog,在5.6版本之后unodlog可以独立出共享表空间,引入MVCC的目的就是减少锁的挣用,通过阅读高性能mysql这本书的解释是MVCC是行级锁的一个变种,使大多数的读操作可以不用加锁,写操作也只锁定必要的行。

 

 

正文

多版本并发控制只针对innodb的repeatable read和read committed这两种隔离级别。多版本并发控制的原理就是在每个记录行后面增加两个标示列用来存储该行的状态,分别存储改行的新系统版本号和删除系统版本号。系统的版本号会随着每增加一个事务递增。

 

TABLE

 

ID

NAME

Trx_id

De_Trx_id

1

a

1

 

有四个事务:select(trx=2),insert(trx=3),delete(trx=4),update(trx=5)

现在这四个事务同时对该行进行操作,演示SELECT的可重复读,假设四个操作在SLECT提交之前都未提交,当然SELECT是能查看到四个操作的记录的。

SELECT:

SELET会根据以下两个条件去查找记录,下面两个条件需要同时满足

1.只查找行的系统版本号小于或等于当前事务版本号的记录行。

2.删除版本号为空或者大于当前事务版本号的记录行。

BEGIN TRAN

SELECT NAME FROM TABLE WHERE ID=1

 

ID

NAME

Trx_id

De_Trx_id

1

a

1

 

 

WAIT 10 MINUTE

SELECT NAME FROM TABLE WHERE ID=1

COMMIT

 

ID

NAME

Trx_id

De_Trx_id

1

a

1

4

根据SELECT 的查找条件INSERT记录的事务版本号大于当前版本号所以不会被查到;DELETE的事务删除版本号大于当前版本号,所以该行会被查出;UPDATE第一行的事务的版本号小于当前版本号而删除版本号大于当前版本号,可以被查到,第二行因为事务版本号大于当前版本号所以不满足,最终SELECT查询的记录是UPDATE操作的第一条记录;SELECT两次查询的结果一致,满足可重复读隔离级别。当然在这里除了INSERT操作,其它的操作都无法在SELECT提交之前提交。

 

 

INSERT:

INSERT INTO TABLE(ID,NAME) VALUES(2,'B');

 

ID

NAME

Trx_id

De_Trx_id

2

b

2

 

 

DELETE:

DELETE FROM TABLE WHERE ID=1;

 

ID

NAME

Trx_id

De_Trx_id

1

a

1

3

 

 

UPDATE:

复制代码
BEGIN TRAN

UPDATE TABLE

SET NAME='B'

WHERE ID=1

COMMIT
复制代码

 

ID

NAME

Trx_id

De_Trx_id

1

a

1

4

 

ID

NAME

Trx_id

De_Trx_id

1

b

4

 

 

 

注意:多版本并发控制不支持myisam存储引擎。

总结  

 在缓存中有一个用于维护锁的资源,对锁的维持需要消耗mysql的资源,多版本并发控制它就是减少了用于维持锁资源的消耗来提高性能,所以日志的写操作都是先undo再redo。

 






本文转自pursuer.chen(陈敏华)博客园博客,原文链接:http://www.cnblogs.com/chenmh/p/5118970.html,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
Oracle 关系型数据库 MySQL
【MySQL】事务四大特性ACID、并发事务问题、事务隔离级别
【MySQL】事务四大特性ACID、并发事务问题、事务隔离级别
26 4
|
10天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之mysql cdc支持全量的时候并发读取,该如何配置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
14天前
|
SQL 关系型数据库 MySQL
查询mysql版本sql - 蓝易云
执行这个命令后,MySQL将返回当前正在运行的版本信息。
42 0
|
15天前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版产品使用合集之2.2.1版本同步mysql数据写入doris2.0 ,同步完了之后增量的数据延迟能达到20分钟甚至一直不写入如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
15天前
|
关系型数据库 MySQL 数据库连接
实时计算 Flink版产品使用合集之是否支持MySQL 5.7以下的版本
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
18天前
|
存储 关系型数据库 MySQL
XtraBackup支持哪些MySQL数据库版本?
【5月更文挑战第13天】XtraBackup支持哪些MySQL数据库版本?
37 0
|
18天前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
【5月更文挑战第13天】PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
14 0
|
18天前
|
关系型数据库 MySQL 数据库
mysqlTools 一分钟部署安装本mysql多个版本,解锁繁琐部署过程
mysqlTools 一分钟部署安装本mysql多个版本,解锁繁琐部署过程
314 2
|
18天前
|
SQL 关系型数据库 MySQL
unsigned int 虽然mysql支持,但是不建议使用,因为可能在未来某个版本删除
unsigned int 虽然mysql支持,但是不建议使用,因为可能在未来某个版本删除
16 2
|
18天前
|
关系型数据库 MySQL Linux
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
131 1