每日一博 - 浅析事务隔离级别 MVCC机制

news/2025/2/13 2:15:12/

文章目录

  • DB四个隔离级别
  • MVCC如何工作的 ?
  • 小结

在这里插入图片描述


DB四个隔离级别

数据库隔离允许事务执行,就像没有其他并发运行的事务一样。

下面的图说明了四个隔离级别。

  • Serializalble: 这是最高的隔离级别。并发交易保证按顺序执行。
  • Repeatable Read: 事务开始时读取的数据保持不变。
  • Read Committed: 只有事务提交后,数据修改才能被其他事务读取。
  • Read Uncommitted: 数据修改可以在事务提交前被其他事务读取。

MVCC如何工作的 ?

隔离性是通过MVCC(多版本一致性控制)和锁来保证的。

下图以Repeatable Read为例,演示MVCC如何工作:

  • 每行有两个隐藏列:transaction_id和roll_pointer。

  • 当事务A开始时,创建一个新的读视图,transaction_id=201。

  • 一会儿过后事务B开始后,创建一个新的读视图,transaction_id=202。

  • 现在,事务A将余额修改为200,创建日志的新行,并且roll_pointer指向旧行。

  • 在事务A提交之前,事务B读取余额数据。事务B发现transaction_id 201尚未提交,它读取下一个已提交的记录(transaction_id=200)。

  • 即使事务A提交,事务B仍然基于事务B开始时创建的读视图读取数据。所以事务B总是读取余额=100的数据。

MVCC通过为每行记录创建多个版本,并且为每个事务生成一个时间点快照(Read View),实现非阻塞读和隔离性。 这种机制允许并发事务同时读取数据,而不会堵塞其他事务
在这里插入图片描述

小结

MySQL 的 MVCC(多版本并发控制)机制主要包含以下几个方面:

  1. 行版本(Version):MySQL 为每行记录维护多个版本,每个版本都有唯一的版本号(Version Number)。

  2. 事务ID(Trx ID):每个事务开始时,会分配一个唯一的事务ID,用于标识事务在时间轴上的位置。

  3. 快照(Snapshot):当事务开始时,MySQL 会为其创建一个快照,快照中包含此时数据页中所有版本和对应事务ID。事务执行期间,所有读请求都在此快照中查找版本。

  4. 时间轴位置判断:事务需要判断其他版本的事务ID是否早于自己,以判断其是否可见。如果早于自己,说明其已提交,自己可见;否则,不可见。

  5. 行版本生成:事务更新数据时,会生成行的新版本,并把新版本的事务ID设置为自己的ID。其他事务只有在此事务提交后,新版本才对其可见。

  6. 事务回滚:如果事务回滚,其生成的所有新行版本都会被移除,不会对其他事务产生影响。

  7. MVCC自更新问题:事务A读取一行,事务B也读取并修改了此行,此时事务A再修改此行。为避免覆盖,事务A生成新版本,并阻塞事务B的修改,等待其提交或回滚。

通过版本判断和控制,MVCC可以实现不同隔离级别下的并发控制:

  • Repeatable Read:利用快照实现
  • Read Committed:通过时间轴判断可见版本实现
  • Read Uncommitted:所有版本都可见

所以,MySQL MVCC 通过行版本和时间轴判断来控制并发事务间的隔离和一致性,这是MySQL并发控制的基石。
在这里插入图片描述


http://www.ppmy.cn/news/98223.html

相关文章

Linux(基础IO详解)

在基础IO这篇博客中,我们将了解到文件系统的构成,以及缓冲区究竟是个什么东东,我们都知道缓冲区,有时也谈论缓冲区,但不一定真的去深入了解过缓冲区。为什么内存和磁盘交互速度如此之慢?为什么都说Linux中一…

【场景方案】带你浅浅了解下前端所需要的一些常用设计模式,提供例子说明

文章目录 前言工厂模式单例模式代理模式观察者模式发布订阅模式装饰器模式尾巴 前言 目前没精力深入了解,所以先记录一些比较常用的设计模式,且不会很深入。 日后有空了,待我深入了解后再更新文章。 部分知识来源双越老师的课程 工厂模式 …

pytorch分布式训练DDP(傻瓜版)

文章目录 为什么要使用分布式训练基本概念常用函数使用DataParrel使用DDP构建主函数训练函数训练器启动 参考文章 为什么要使用分布式训练 单卡显存不够了!!!(核心原因)比较高级,比较快。 基本概念 worl…

C++:STL--List

文章目录 一.STL-list的数据结构链表结点模板 二.List的框架与迭代器的实现1.STL中的容器迭代器2.List的迭代器List正向遍历迭代器类模板(对ListNode< T >* 指针的封装)反向遍历迭代器的类模板(对正向迭代器的封装) 3.List的实现框架 三. List的成员接口的实现1.在List类…

CorelDRAW2023序列号及下载安装条件

始于1989年并不断推陈出新,致力为设计工作者提供更高效的设计工具&#xff01;CorelDRAW滋养并见证了一代设计师的成长&#xff01;在最短的时间内交付作品&#xff0c;CorelDRAW的智能高效会让你一见钟情&#xff01;CorelDRAW 全称“CorelDRAW Graphics Suite“&#xff0c;也…

【JAVAWEB】HTML的常见标签

目录 1.HTML结构 1.1认识HTML标签 1.2HTML文件基本结构 1.3标签层次结构 1.4快速生成代码框架 2.HTML常见标签 注释标签 标题标签&#xff1a;h1-h6 段落标签:p 换行标签&#xff1a;br 格式化标签 图片标签 超链接标签&#xff1a;a 表格标签 列表标签 表单标…

如何使用ChatGPT?初学者简单指南

Chat GPT 风靡全球&#xff0c;并在短时间内成为世界上增长最快的应用程序。随着所有关于其潜在影响的讨论&#xff0c;你可能会想知道&#xff1a;如何使用 ChatGPT&#xff1f; 使用 ChatGPT需要准备&#xff1a;一个 OpenAI 帐户和一个网络浏览器。 访问chat.openai.com并…

数据在内存中的存储(1)——整形

目录 1、数据类型介绍 1.1、类型的基本归类 整形家族 浮点数家族 指针类型 空类型 构造类型 2、整形在内存中的存储 2.1、原码、反码、补码 2.2、大小端介绍 2.3、有符号与无符号 2.4、练习 例一 例二 例三 例四 例五 1、数据类型介绍 我们先来简单了解一下我们前面所学的基…