IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MVCC简单学习 -> 正文阅读

[大数据]MVCC简单学习

MVCC

首先介绍一下什么是MVCC

MVCC的全称为Multi-Version Concurrency Control,它是InnoDB存储引擎中对非锁定读的实现(当我们通过MVCC来读取当前执行实现数据库中行的数据时,如果读取的行正在执行DELETE或UPDATE操作时,这时的读取操作不会去等待行上锁的释放,而是去读取行的一个快照数据。)

InnoDB对MVCC的实现

在InnoDB中的MVCC的实现依赖于隐藏字段Read Viewundo log

1. 隐藏字段

关于隐藏字段InnoDB存储引擎为没行数据添加了三个隐藏字段

  • DB_TRX_ID(6字节):表示最后一次插入或更新该行的事务 id。此外,delete 操作在内部被视为更新,只不过会在记录头 Record header 中的 deleted_flag 字段将其标记为已删除
  • DB_ROLL_PTR(7字节) 回滚指针,指向该行的 undo log 。如果该行未被更新,则为空
  • DB_ROW_ID(6字节):如果没有设置主键且该表没有唯一非空索引时,InnoDB 会使用该 id 来生成聚簇索引

我接触到的比较的多的还是前两个字段。

2. Read View

Read View在我个人认知上他最重要的一点是存储了“对于当前事务不可见的其他活跃事务(未提交的事务)”

Read View中主要的字段

  • m_low_limit_id:目前出现过的最大的事务 ID+1,即下一个将被分配的事务 ID。大于等于这个 ID 的数据版本均不可见
  • m_up_limit_id:活跃事务列表 m_ids 中最小的事务 ID,如果 m_ids 为空,则 m_up_limit_idm_low_limit_id。小于这个 ID 的数据版本均可见
  • m_idsRead View 创建时其他未提交的活跃事务 ID 列表。创建 Read View时,将当前未提交事务 ID 记录下来,后续即使它们修改了记录行的值,对于当前事务也是不可见的。m_ids 不包括当前事务自己和已提交的事务(正在内存中)
  • m_creator_trx_id:创建该 Read View 的事务 ID

image-20220307162140045

3. undolog

undo log在我看来是十分重要的,我们事务的回滚和MVCC都依赖undo log来实现

两个作用:

  • 当事务回滚时用于将数据恢复到修改前的样子
  • 另一个作用是 MVCC ,当读取记录时,若该记录被其他事务占用或当前版本对该事务不可见,则可以通过 undo log 读取之前的版本数据,以此实现非锁定读

在InnoDB存储引擎中undo log分为两种 insert undo log和 update undo log

重点看update undo log,因为insert操作的自己只对事务本身可见,对其他事务不可见,故该undo log可以在事务提交后删除

update undo log

这时候就需要到了我们之前提到的隐藏列了DB_ROLL_PTR(7字节) 回滚指针

当我们进行数据修改时的情况是

image-20220307163339918

PC和RR隔离级别下MVCC的差异

两者主要的差异主要是在生成Read View时机

  • PC隔离级别下是每次select查询前都生成一个Read View
  • PR隔离级别是在开始事务后第一次select数据前生成一个Read View

MVCC + Next-key-Lock防止幻读

  1. 在执行普通select时会以MVCC快照读的方式来读取数据

  2. 在执行当前读(select…for update/lock in share mode、insert、update、delete 等)的情况下InnoDB会使用Next-key Lock来防止这种情况

    当执行当前读时,会锁定读取到的记录的同时,锁定它们的间隙,防止其它事务在查询范围内插入数据。只要我不让你插入,就不会发生幻读 --《JavaGuide》

参考

JavaGuide

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:34:18  更:2022-03-08 22:36:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 19:47:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码