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和BufferPool(六) -> 正文阅读

[大数据]MVCC和BufferPool(六)

数据库笔记

MVCC

MVCC = undo + read-view

为了隔离性而服务

定义:

MVCC:多版本并发控制机制,在 读已提交和可重复读 隔离级别下实现了MVCC机制

特点:

不通过加锁,来实现事务之间的隔离性

实现原理

undo日志版本链

定义:

undo日志版本是指 一行数据被多个事务依次修改过后, **MySQL会保留每次操作前的数据。**并用 trx_id事务id】 和 roll_pointer回滚指针】将undo日志串联起来,形成历史记录版本链。

undo日志版本链

特别的:

对于删除的情况

  • 会将版本链上最新的数据复制一份
  • 然后将trx_id修改成删除操作的trx_id
  • 在该条记录的头信息里面的 delete_flag 标记位上置为true

特点:

  • 对于多个事务,日志版本链只有一份
  • 事务id和回滚指针 是隐藏的字段

一致性视图 read-view

定义:

当事务开启时,执行任何的查询SQL,会生成当前事务的 一致性视图

组成:

  • 视图数组
    • 当前所有未提交的事务id组成
  • 已创建的最大事务id

{ [未提交id1,未提交id2,未提交id3,未提交id4] max_id }

注意:

事务id在==执行第一个DML语句时,才会生成,== 而不是在begin/start transaction生成。

版本链比对规则

例子

readview:{ [200],300 }

规则:

  1. 执行查询语句
  2. 版本链从上往下寻找,如果 delete_flag == true,不返回数据。反之:
    • 如果trx_id 落在 绿色部分(trx_id < min_id),表示该版本由已经提交的事务生成,可见
    • 如果trx_id 落在 红色部分(trx_id > max_id),表示该版本由未提交的事务生成,不可见
    • 如果trx_id 落在 黄色(min_id < trx_id < max_id)
      • 如果trx_id 不存在 视图数组([200]) 中,表示该版本由已经提交的事务生成,可见
      • 如果trx_id 存在 视图数组([200]) 中,表示该版本由未提交的事务生成,不可见

MVCC读已提交

实现了MVCC机制

特点:

  • read-view 数组在每次查询动态变化,实现了可以读取已经提交事务修改的特性

MVCC可重复读

实现了MVCC机制

特点:

  • ==read-view 数组生成后就固定不变,==实现了隔离性。

BufferPool

BufferPool引擎层InnoDB实现,基于LRU算法

为什么设计BufferPool?

因为没有BufferPool,一次请求就需要对磁盘进行一次 随机读写I/O更新磁盘数据,性能差;

虽然设计BufferPool,会有对日志文件的读写,但对日志文件是顺序读写I/O,性能会比随机读写I/O高很多

一条sql的执行(服务层)

一条DMLsql的执行 (引擎层)

  1. 从磁盘ibd文件中加载缓存数据
  2. 将旧值写入undo日志文件 【版本链、事务提交失败回滚
  3. 更新BufferPool中的数据
  4. redo日志缓存
  5. redo日志文件 【事务提交成功,系统宕机时恢复BufferPool数据
  6. bin-log日志文件 【事务提交成功,系统宕机时恢复磁盘数据
  7. commit标记到redo日志文件 【确保redo和bin-log一致性
  8. 后台线程随机BufferPool修改的数据以页为单位写入磁盘ibd文件
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:36:32  更:2022-02-28 15:40:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:32:54-

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