英文全称为Multi-Version Concurrency Control,翻译为中文即 多版本并发控制。

基本原理

MVCC的实现,通过保存数据在某个时间点的快照来实现的。这意味着一个事务无论运行多长时间,在同一个事务里能够看到数据一致的视图。根据事务开始的时间不同,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。

基本特征

InnoDB存储引擎MVCC的实现策略

在每一行数据中额外保存两个隐藏的列:当前行创建时的版本号和删除时的版本号(可能为空,其实还有一列称为回滚指针,用于事务回滚,不在本文范畴)。这里的版本号并不是实际的时间值,而是系统版本号。每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较。

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

MVCC下InnoDB的增删查改是怎么work的

1.插入数据(insert):记录的版本号即当前事务的版本号

执行一条数据语句:insert into testmvcc values(1,"test");

假设事务id为1,那么插入后的数据行如下:

Mysql中MVCC的使用及原理详解

2、在更新操作的时候,采用的是先标记旧的那行记录为已删除,并且删除版本号是事务版本号,然后插入一行新的记录的方式。

比如,针对上面那行记录,事务Id为2 要把name字段更新

update table set name= 'new_value' where id=1;

Mysql中MVCC的使用及原理详解

3、事务Id为3  做删除操作的时候,就把事务版本号作为删除版本号。比如

delete from table where id=1;

Mysql中MVCC的使用及原理详解

 

4、查询操作:

从上面的描述可以看到,在查询时要符合以下两个条件的记录才能被事务查询出来:

1) 删除版本号未指定或者大于当前事务版本号,即查询事务开启后确保读取的行未被删除。(即上述事务id为2的事务查询时,依然能读取到事务id为3所删除的数据行)

2) 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在当前事务中(等于的情况)或者在当前事务启动之前的其他事物进行的insert。

(即事务id为2的事务只能读取到create version<=2的已提交的事务的数据集)

补充:

1.MVCC手段只适用于MySql隔离级别中的读已提交(Read committed)和可重复读(Repeatable Read).

2.Read uncimmitted由于存在脏读,即能读到未提交事务的数据行,所以不适用MVCC.

原因是MVCC的创建版本和删除版本只要在事务提交后才会产生。

3.串行化由于是会对所涉及到的表加锁,并非行锁,自然也就不存在行的版本控制问题。

4.通过以上总结,可知,MVCC主要作用于事务性的,有行锁控制的数据库模型。

1、下载mysql 5.7.31安装包
下载地址:
链接: https://pan.baidu.com/s/1kYZ9puiHma5zFx2L3On6gw 提取码: 38na

2、解压安装包
将下载好的mysql压缩包解压至D盘根目录下,并重命名为mysql-5.7.31

3、配置环境变量
新建系统变量,MYSQL_HOME
在这里插入图片描述
编辑Path系统变量,添加%MYSQL_HOME%bin
在这里插入图片描述
4、进入到mysql目录下,新建my.ini文件,编辑文件,加入以下内容
[mysqld]
#设置端口3306(mysql的默认端口为3306)
port=3306
#设置mysql的安装目录
basedir=D:mysql-5.7.31
#设置mysql数据库的数据的存放目录
datadir=D:mysql-5.7.31data
#允许最大连接数
max_connections=200
#允许连接失败的次数。
max_connect_errors=10
#设置mysql服务器使用的字符集,默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8
[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8

5、以管理员身份打开cmd命令窗口,进入到D:mysql-5.7.31bin目录下
执行
mysqld -install
执行成功后提示:Service successfully installed.

继续执行
mysqld --initialize-insecure --user=mysql
执行成功后会在mysql的安装目录下生成data目录并创建root用户

6、启动mysql服务
执行
net start mysql

7、设置root用户密码
执行
mysqladmin -u root -p password 新密码
提示输入密码,直接按回车即可设置成功

完成以上步骤即可正常使用mysql数据库了

LarkMidTable

gitHub地址: https://github.com/wxgzgl/LarkMidTable
方便推广开源产品,希望觉得不错的可以Star项目,可以加入我们一起研发!!!

中文 | English

Lark中文名称 云雀,云代表大数据,雀代表平凡和自由。

LarkMidTable 是一站式开源的数据中台,实现元数据管理,数据仓库开发,数据质量管理,数据的可视化,实现高效赋能数据前台并提供数据服务的产品。

产品愿景

1.满足许多的小企业,提供一站式的解决方案。

2.做出世界级别,能够媲美BAT大厂的产品。

3.创造价值,产生价值,让世界变得更加美好。

技术选型

框架名称 框架用途 主要功能
Dolphin 任务调度 Task以DAG形式关联,实时监控任务的状态,支持Shell、MR、Spark、SQL、依赖等10多种任务类型,支持每日十万数据量级任务稳定运行
Flink 离线和实时计算框架 Flink实现流批一体化、机器学习(FlinkML)、图分析(Gelly)、复杂事件处理(CEP)、关系数据处理(Table)
Hive 数据仓库 将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句语句转变成MapReduce任务来执行。
Kylin 分析数据库 Kylin 支持 SQL,Kylin 的 SQL on Hbase
Kafka 消息中间件 应用解耦、异步处理、流量削峰、日志处理、消息通信
Kubernetes 容器部署 重新启动失败的容器、弹性伸缩、服务的自动发现和负载均衡、滚动升级和一键回滚
Zookeeper 分布式协调服务 统一命名服务、配置管理、集群管理、队列管理

产品架构图

系统架构图

目前支持的数据库

数据库类型 读取类型 写入类型
批处理同步 Mysql 支持 支持
PostgreSql 支持 支持
Mongodb 支持 支持
SqlServer
ClickHouse
Hive 支持
Hbase 支持 支持
Hdfs 支持 支持
ElasticSearch
Kudu
Redis
流处理同步 Kafka
MySQL Binlog
MongoDB Oplog
PostgreSQL WAL

快速开始

请点击 快速开始

前端代码 前端代码

资源库 研发资源库

开发规范 唯品会开发规范

特别鸣谢

本项目在datax-web代码的基础上进行二次重构开发,在此特别感谢datax-web团队。

技术交流

搜索QQ群号[678097205]或者扫描下面的二维码进入LarkMidTable 社区的QQ群,目前正是开源的初期阶段,群里达到91人

QQ群

问题

之前遇到的一个问题,我跑testcase的时候,突然出现这个问题,一开始以为是数据库迁移的问题,删了之后,发现还是有问题,后来仔细看报错信息,才明白,原来是中文编码的问题。mysql默认编码是Latin1,因此,我们需要更改为utf-8
遇到的问题
解决方案
中文乱码
修改my.ini文件