MySQL事务底层原理和MVCC机制

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL事务底层原理和MVCC机制

MySQL事务底层原理和MVCC机制

1 数据库事务

数据库事务是一个跟关键的概念,事务的特性就是我们经常说的ACID,一句话解释就是要么全都成功要么全都失败。

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

2 MySQL事务底层原理和实现机制

MySQL事务机制的核心是两个日志文件:

  • redo log(重做日志)
  • undo log(回滚日志)
2.1 redo log

redo log主要实现的是事务中的持久性,记录物理数据变化即DML操作

redo log分为两部分:redo log file 和redo log buffer ,redo log file负责将内容存储到磁盘,redo log buffer负责将内容加载到内存

重要概念:日志先行

2.2 undo log

undo log主要实现的是事务中的原子性,负责日志的回滚操作,并实现MVCC

如何回滚?

答:执行逆向SQL语句实现回滚操作,比如操作的语句是insert into …,回滚时undo log就会执行delete form …

3 MVCC机制

3.1 事务的隔离级别

可以看下我之前写过的一篇文章:MySQL事务隔离级别

为什么要提到MySQL事务的隔离级别呢,因为MVCC机制只在两个事务隔离级别下才能正常工作,分别是

  • read-committed
  • repeatable-read
3.2 MVCC机制

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制,指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。

那么MySQL是如何实现MVCC的呢?

答:三大法宝,隐藏字段、undo log、read view,分别分析下

3.2.1 隐藏字段
  • TRX_ID事务ID:最后一次修改该记录的事务ID
  • ROLL_PTR回滚指针:指向这条记录的上一个版本的字段
  • ROW_ID隐含的自增ID:如果数据表没有主键,InnoDB会自动以ROW_ID产生一个聚簇索引

所以,这三个隐藏字段的出现,可以让我们把MySQL数据表当做早期的HashMap,即数组+链表,每一个表的每一行字段的一个隐藏字段都是指向它修改之前的数据的,但是数据并没有存储在数据表中,而是存储在MySQL日志中。

3.2.2 undo log

上边已经讲过了,undo log就是将SQL语句逆向的执行,分为两种,一种是insert语句的逆向,另一种这是update语句的逆向。

3.2.3 read view

什么是Read View,说白了Read View就是事务进行快照读操作的时候生产的读视图(Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)

所以我们知道 Read View主要是用来做可见性判断的, 即当我们某个事务执行快照读的时候,对该记录创建一个Read View读视图,把它比作条件用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。

Read View遵循一个可见性算法,主要是将要被修改的数据的最新记录中的DB_TRX_ID(即当前事务ID)取出来,与系统当前其他活跃事务的ID去对比(由Read View维护),如果DB_TRX_ID跟Read View的属性做了某些比较,不符合可见性,那就通过DB_ROLL_PTR回滚指针去取出Undo Log中的DB_TRX_ID再比较,即遍历链表的DB_TRX_ID(从链首到链尾,即从最近的一次修改查起),直到找到满足特定条件的DB_TRX_ID, 那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新老版本

  • trx_list 事务列表
    一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID
  • up_limit_id 最小的ID
    记录trx_list列表中事务ID最小的ID
  • low_limit_id 事务ID的最大值+1
    ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1
  • 首先比较DB_TRX_ID < up_limit_id, 如果小于,则当前事务能看到DB_TRX_ID 所在的记录,如果大于等于进入下一个判断
  • 接下来判断 DB_TRX_ID 大于等于 low_limit_id , 如果大于等于则代表DB_TRX_ID 所在的记录在Read View生成后才出现的,那对当前事务肯定不可见,如果小于则进入下一个判断
  • 判断DB_TRX_ID 是否在活跃事务之中,trx_list.contains(DB_TRX_ID),如果在,则代表我Read View生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的;如果不在,则说明,你这个事务在Read View生成之前就已经Commit了,你修改的结果,我当前事务是能看见的

参考链接:https://www.cnblogs.com/xuwc/p/13873611.html

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
6天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
27 5
|
20天前
|
存储 缓存 关系型数据库
MySQL事务的四大特性是如何保证的
在MySQL数据库中还有一种二进制日志,其用来基于时间点的还原及主从复制。从表面上来看其和重做日志非常相似,都是记录了对于数据库操作的日志。但是,从本质上来看有着非常大的不同。
10 1
|
1月前
|
存储 SQL 关系型数据库
[MySQL]事务原理之redo log,undo log
[MySQL]事务原理之redo log,undo log
|
9天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
27天前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
79 1
|
22天前
|
Ubuntu 关系型数据库 MySQL
Ubuntu 中apt 安装MySQL数据库
Ubuntu 中apt 安装MySQL数据库
66 0
|
1天前
|
关系型数据库 MySQL Linux
Linux联网安装MySQL Server
Linux联网安装MySQL Server
5 0
|
1天前
|
关系型数据库 MySQL Linux
centos7安装mysql-带网盘安装包
centos7安装mysql-带网盘安装包
11 2

推荐镜像

更多