详解Mysq MVCC多版本的并发控制


Posted in MySQL onApril 29, 2022

1、MVCC

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有>读写冲突时,也能做到不加锁,非阻塞并发读。

2、当前读

像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

3、快照读(提高数据库的并发查询能力)

像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

4、当前读、快照读、MVCC关系

MVCC多版本并发控制指的是维持一个数据的多个版本,使得读写操作没有冲突,快照读是MySQL为实现MVCC的一个非阻塞读功能。MVCC模块在MySQL中的具体实现是由三个隐式字段,undo日志、read view三个组件来实现的。

5、MVCC实现原理

mvcc的实现原理主要依赖于记录中的三个隐藏字段,undolog,read view来实现的。

隐藏字段

行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段

DB_TRX_ID

6字节,最近修改事务id,记录创建这条记录或者最后一次修改该记录的事务id

DB_ROLL_PTR

7字节,回滚指针,指向这条记录的上一个版本,用于配合undolog,指向上一个旧版本

DB_ROW_JD

6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个6字节的row_id

undo log

undolog被称之为回滚日志,表示在进行insert,delete,update操作的时候产生的方便回滚的日志 当进行insert操作的时候,产生的undolog只在事务回滚的时候需要,并且在事务提交之后可以被立刻丢弃 当进行update和delete操作的时候,产生的undolog不仅仅在事务回滚的时候需要,在快照读的时候也需要,所以不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(当数据发生更新和删除操作的时候都只是设置一下老记录的deleted_bit,并不是真正的将过时的记录删除,因为为了节省磁盘空间,innodb有专门的purge线程来清除deleted_bit为true的记录,如果某个记录的deleted_id为true,并且DB_TRX_ID相对于purge线程的read view 可见,那么这条记录一定时可以被清除的)

Read View

Read View是事务进行快照读操作的时候生产的读视图,在该事务执行快照读的那一刻,会生成一个数据系统当前的快照,记录并维护系统当前活跃事务的id,事务的id值是递增的。

6、MVCC核心思想

MVCC 的核心思想是: 我可以查到在我这个事务开始之前已经存在的数据,即使它在后面被修改或者删除了。在我这个事务之后新增的数据,我是查不到的。

MVCC查找规则:只能查找创建时间小于等于当前事务ID的数据和删除时间大于当前事务ID的行(或未删除)

详解Mysq MVCC多版本的并发控制

如图,在Transaction1事务中插入两条数据,并提交事务,然后在Transaction2事务中读取,读取到两条数据

详解Mysq MVCC多版本的并发控制

如图,在Transaction3事务中插入一条为老连的数据,然后在Transaction2事务读取,根据mvcc规则,不能查到在我的事务开始之后插入插入的数据,老连的创建ID大于2,所以只能查到两条数据

详解Mysq MVCC多版本的并发控制

如图,在Transaction4事务中删除id为2的数据,然后在Transaction2事务读取,根据mvcc规则,可以查到在我的事务开始之后插删除的数据,老晁还是可以查出来所以还是查到两条数据

详解Mysq MVCC多版本的并发控制

如图,在Transaction5事务中下,添加一条name=涛哥的数据,删除id=1数据,修改name=涛哥的id为1,然后在Transaction2事务读取,根据mvcc规则,可以查到在我的事务开始之后插删除的数据,老严还是可以查出来,所以还是查到两条数据

通过以上演示我们能看到,通过版本号的控制,无论其他事务是插入、修改、删除,Transaction2事务查询到的数据都没有变化。

到此这篇关于Mysql MVCC多版本并发控制详情的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
MySQL 条件查询的常用操作
Apr 28 #MySQL
mysql 子查询的使用
Apr 28 #MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 #MySQL
优化Mysql查询的示例
Apr 26 #MySQL
MySQL的存储过程和相关函数
Apr 26 #MySQL
mysql 索引的数据结构为什么要采用B+树
You might like
在PHP中使用模板的方法
2008/05/24 PHP
php抓取https的内容的代码
2010/04/06 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
jQuery 名称冲突的解决方法
2011/04/08 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python判断端口是否打开的实现代码
2013/02/10 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
Python对象转换为json的方法步骤
2019/04/25 Python
python之yield和Generator深入解析
2019/09/18 Python
基于Python的OCR实现示例
2020/04/03 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
python代码中怎么换行
2020/06/17 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
四种会话跟踪技术
2015/05/20 面试题
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
抵押贷款承诺书
2014/05/30 职场文书
音乐学专业求职信
2014/07/22 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
买房子个人收入证明
2014/10/12 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书