MySQL----MVCC机制

一、概述

首先,我们要先搞懂MVCC是用来做什么的,它本身是一个并发控制思想,用于在并发情况先,读操作不阻塞写操作,写操作不阻塞读操作,从而大幅度提高MySQL数据库的并发能力。(还有一种说法是解决不可重复读的问题)在MySQL中,MVCC是由版本链和readView组成的。首先,版本链是由Undolog日志和MySQL针对每行数据的隐藏字段--trx_id和上个版本的指针。而readView它定义了当前事务能看到哪些版本的数据,可以看作是当前数据库的一个"快照"。

二、readView解析

它是由以下字段组成,它们的大概意思是:

1.min_id:最小事务Id(活跃事务的最小Id)

2.max_id:全局的下一个事务Id。

3.cur_trx_id:当前的事务Id。

4.active_id_list:当前活跃的事务Id。

首先,小于min_id的事务都是已经提交的,一定是可以读的,其次active_id_list中的Id都是正在写的,也就是还没提交的,是一定不能读的。如果事务Id是大于等于max_id的,那也是不可以读的。如果id小于max_id同时大于min_id,还不在active_id_list中的。它是已经提交的事务,也是可以读的。

同时readView的生成时机也决定了MySQL的隔离级别,如果每次进行查询时都更新一次,那它就是读已提交的级别,因为此时MySQL并不能保证两次读的数据是一样的。如果只在第一次查询时更新,那么它就是可重复读的隔离级别。因为此时可读的事务Id都是固定的,每次查询结果都一样。

三、版本链

首先InnoDB数据引擎会在每张表中生成以下隐藏字段:

1.DB_TRX_ID:表示最后一次插入或修改该数据的事务Id,同时Del操作也被视为一次特殊更新。

2.DB_ROLL_PTR:它指向上一个历史版本在UndoLog中的地址,它将这些历史版本串为一个版本链。

3.DB_ROW_ID:这个在表中没有主键时自动生成,与MVCC关系不大。

而UndoLog则是一个日志,它会将每次对数据的更新操作都记录进来,包含每个字段的值。DB_ROLL_PTR则将这些记录都连起来,形成一个版本链,链头是最新的版本,链尾则是最旧的版本。

四、MVCC的优缺点

优点:读操作大部分无需加锁,显著提高了MySQL的并发能力,而且也为实现可重复读提供了一个参考思路。

缺点:需要维护Undolog,这无法避免的增加了空间开销,同时还要引入Purge线程来单独定期清除UndoLog,不然会无限增长。同时引入一个新机制,MySQL的系统复杂度也会上升。

相关推荐
韩立学长16 分钟前
基于Springboot的旧物公益捐赠管理系统3726v22v(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
苦学编程的谢1 小时前
Redis_4_常见命令(完)+认识数据类型和编码方式
数据库·redis·缓存
小光学长1 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
小光学长1 小时前
基于Vue的地铁综合服务管理系统7949eg04(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
Yeats_Liao1 小时前
时序数据库系列(二):InfluxDB安装配置从零搭建
数据库·后端·时序数据库
Yeats_Liao1 小时前
时序数据库系列(一):InfluxDB入门指南核心概念详解
数据库·后端·时序数据库·db
betazhou2 小时前
Oracle ADG ,DGBroker管理,异常断电重启主备库的状态
数据库·oracle·goldengate·dgbroker
岁岁岁平安2 小时前
本机 MongoDB 注册系统服务、启用security认证
数据库·python·mongodb
007php0073 小时前
某游戏互联网大厂Java面试深度解析:Java基础与性能优化(一)
java·数据库·面试·职场和发展·性能优化·golang·php
数据库生产实战3 小时前
Oracle RAC灾备环境UNDO表空间管理终极指南:解决备库修改难题与性能优化实战
数据库·oracle·性能优化