Mysql DBA学习笔记(MVCC)

主题:InnoDB引擎-MVCC

MVCC:多版本并发控制

一、MVCC相关概念:

1、当前读(current read)

特点:读取记录的最新版本,并对读取记录加锁(保证其他并发事务不能修改当前正在读取的记录),可能会被其他事务阻塞

例子:select ... lock in share mode(共享锁),select ... for update

2、快照读(snapshot read)

特点:读取数据的可见版本(可能是历史版本数据),不加锁,不会被其他事务阻塞

例子:简单select语句

三种隔离级别:
1)Read Committed(读已提交):避免脏读,但可能导致不可重复读

-每次select,都生成一个快照读

2)Repeatable Read(可重复读):避免脏读和不可重复读,但可能导致幻读

-开启事务后,第一个select语句是快照读(默认隔离级别)

3)Serializable(串行化):避免发生以上问题

-快照读=当前读

--所有隔离级别,每个事务在开始时都会创建一个快照。

二、MVCC概念

多版本并发控制 (Multi-Version Concurrency Control,简称 MVCC)

是一种数据库并发控制方法,通过维护数据的多个版本 来实现读写操作的并行执行

MVCC 的主要目的是实现高并发下的数据一致性与隔离性

它通过为每个事务提供数据的一个"快照"(快照读 ),确保事务在其执行期间看到的数据是一致的,从而避免了幻读、不可重复读等现象。

此外,MVCC 还减少了锁的使用,降低了锁竞争,提高了系统的吞吐量。

三、MVCC的具体实现原理

数据库记录中的三个隐式字段,undo log日志,readview

1、记录中的三个隐藏字段

在创建表时会自动创建两个隐式字段:DB_TRX_ID和DB_ROLL_PTR,若创建的表没有主键,则会再创建一列DB_ROW_ID作为隐式主键。

  • DB_TRX_ID(transcation id):记录最后一次插入/修改该行记录的事务 ID。
  • DB_ROLL_PTR(回滚指针):指向 Undo Log 的指针(指向这条记录的上一个版本),用于访问该行的历史版本。
2、Undo Log日志(回滚日志)

每当一行数据被修改(INSERT、UPDATE、DELETE)时,InnoDB 会将旧版本的数据存储在 Undo Log 中。

Undo Log 包含以下信息:

  • 事务 ID(trx ID):标识修改该行的事务。

  • 行的旧版本数据:在修改前的行数据。

3、Undo Log 版本链

链表头部为最新记录,尾部为最早的记录。

4、Read View(读视图)

创建 Read View 时,事务会记录活跃未提交的 )事务列表和当前事务 ID。(未提交的事务都算做活跃事务

creator_trx_id:RC隔离级别下,执行快照读时会生成一个readview,这个readview对应的creator_trx_id就为当前创建快照读的事务id。

版本链数据访问规则:

trx_id:当前Undo Log记录对应当前事务ID

获取历史版本数据时,判断获取的是哪个版本,就是拿trx_id和上面4个readview核心字段做比较。

另一种对Undo Log的描述版本:

不同隔离级别,生成readview时机不同:

  • Read Committed(读已提交):事务中每一次生成快照读时,生成readview。
  • Repeatable Read(可重复读):事务中第一次执行快照读时生成readview,后续复用这一readview。
基本上主要比较的就是版本链数据访问规则中的min_trx_id(最小活跃事务id)来确认快照读生成的是哪一个版本的数据。

四、参考文章/作者

黑马程序员 Mysql数据库从入门到精通。

文章 "MySQL的MVCC是什么?为什么需要MVCC?",来自华为云,https://bbs.huaweicloud.com/blogs/455611

相关推荐
Database_Cool_12 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
Database_Cool_12 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白13 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
a11177614 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao14 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
liuxiaowei314 小时前
【绝版教程】新版MySQL DBA高级实战进阶班 MySQL8.0 姜承尧-腾讯数据库总监
数据库·mysql·dba
你想知道什么?16 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御16 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
AOwhisky17 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
sg_knight17 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db