文章目录

    • @[toc]
  • Innodb MVCC实现原理
    • 隐式字段
    • Read View(读视图)
    • 例子
      • 版本链
      • 版本回退
    • undo日志
      • insert undo log
      • update undo log
  • MVCC与二级索引(辅助索引)

Innodb MVCC实现原理

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。

mvcc的主要是为了提高并发读写能力,不用加锁就能让多个事物并发读写

官网对mvcc的介绍:
https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html


隐式字段

InnoDB存储引擎在每行记录上隐式存有三个字段

列名            长度(字节)    作用
DB_TRX_ID       6       事物ID:表示最后一个事务的更新和插入。。(删除视为更新,将其标记为已删除)DB_ROLL_PTR       7       回滚指针:指向当前记录项的undo log信息,存储于rollback segment里DB_ROW_ID     6       隐含的自增ID(隐藏主键):DB_ROW_ID是自增的,如果创建表时没有制定主键,默认使用DB_ROW_ID作为主键;)实际还有一个删除字段, 记录被更新或删除。

事物中修改记录时,innodb先将记录复制到 undo log中,然后再以排他锁的形式修改原始记录,此时新记录的DB_ROLL_PTR指向undo log中对应的旧记录。
当发生回滚时,根据DB_ROLL_PTR指向的undo log记录回滚即可;


Read View(读视图)

使用read view做版本选取

Read View是一个包含当前已经开始但是没有提交的事务的列表,记录每个事务的事务id,

记最小事务id为min_id,最大事务id为max_id;

版本比较规则:

如果 当前记录 的 trx_id < min_id,说明这个记录版本是已经被提交过的,对其他事务可见;如果 当前记录 的 trx_id > max_id ,说明这个记录版本是Read View生成之后发生的,该记录版本不能访问;如果 当前记录 的trx_id在min_id和max_id之间,则判断trx_id是否在ReadView中:
如果在ReadView中,说明事务还未提交,该记录版本不可访问;
如果不在ReadView中,说明该事务已经提交,该记录版本可以访问;

如果当前记录版本不可读,就根据回滚指针roll_pointer找到旧版本的记录再进行判断;


RC以及RR的区别

对于 隔离级别 为 读取已提交,每次查询都会生成一个新的ReadView; 对于 隔离级别 为 可重复度,一个事务在第一次SELECT的时候生成一个ReadView,之后的查询复用这个ReadView;

RC以及RR的区别就在于,RC事务隔离级别下,每次获取数据的时候,都会重新生成新的ReadView,再根据ReadView中的信息进行数据读取的判断。


例子

版本链

一个新增的数据,事物ID=10,此时 回滚指针为null

事物a(事物ID=12)修改count=15,此时回滚指针指向对应的 undo log地址

事物b(事物ID=20) 修改count=21,记录以 头插法 插入 undo log


版本回退

隔离级别 为 可重复读 时:

假设现在有事务A(事物ID=12)以及事务B(事物ID=34)两个事务,A事务需要读取数据,B事务需要修改数据。
记录中的事物ID=11;

此时活跃事物(开启事物但还未提交的)只有事物a 和 事物b,则 read view={12,34},

当事物a读取数据时,发现 记录中的事物ID=11 < min_id(min[read viem]),说明当前读取的数据是在事务A开启之前提交的,因此可以正常进行数据读取。

具体回退规则见 rearview


undo日志

undo log主要分为两种:

insert undo log

代表事务在insert新记录时产生的undo log;
只在事务回滚时需要,并且在事务提交后可以被立即丢弃;

update undo log

事务在进行update或delete时产生的undo log;
不仅在事务回滚时需要,在快照读时也需要,所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被++purge线程++统一清除;

MVCC与二级索引(辅助索引)

聚集索引中的记录会就地更新,因为记录中有指向undo log的隐藏字段,辅助索引不会就地更新;

当更新二级索引,旧的二级索引记录将被 标记为 删除,新记录将被插入,被标记为删除的记录最终将被清除。

如果二级索引被标记为删除或被新的事物更新,就不会使用 索引覆盖,会到聚集索引中查找记录;

MySQL MVCC(多版本并发控制)相关推荐

  1. MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)

    文章目录 一.MVCC概念 二.MVCC应用于已提交读隔离级别 1. 解决脏读 2. 无法解决不可重复读 3. 无法解决幻读 三.MVCC应用于可重复读隔离级别 1. 解决脏读 2. 解决不可重复读 ...

  2. MYSQL专题-MVCC多版本并发控制

    MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内 ...

  3. 【SQL】MVCC 多版本并发控制

    MVCC多版本并发控制 快照读与当前读 隔离级别 隐藏字段,undo log 版本链 隐藏字段trx_id 版本链 read view 举例说明 read committed(读已提交)隔离级别下 r ...

  4. 【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制

    什么是 MVCC MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL.Oracle.PostgreSQL 等)引擎 ...

  5. MySQL的多版本并发控制(MVCC)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:又一程序员进了ICU:压垮一个家庭,一张结算单就够 个人原创100W+访问量博客:点击前往,查看更多 来源:ht ...

  6. MySQL 高级 —— MVCC 多版本并发控制

    引言 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁.基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制--MVCC.包括其他数据库如Oracle等,由于MVCC并没有一个统一的实现 ...

  7. MySQL MVVC多版本并发控制

    一.概述 MVCC(Multiversion Concurrency Control),多版本并发控制.它和undo log中的版本链息息相关,MVVC通过数据行的多个版本来实现数据库的并发控制. 简 ...

  8. MySQL数据库MVCC多版本并发控制简介

          MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是 ...

  9. 【MySQL】MVCC多版本并发控制(重点:MVCC实现原理之ReadView)

    [大家好,我是爱干饭的猿,本文重点介绍MySQL的MVCC概念.快照读与当前读.MVCC实现原理之ReadView.隐藏字段.Undo Log版本链. 后续会继续分享MySQL和其他重要知识点总结,如 ...

  10. MySQL第一讲 一遍让你彻底掌握MVCC多版本并发控制机制原理

    Mysql在可重复读隔离级别下,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果.这个隔离性就是靠MVCC(Multi-Versio ...

最新文章

  1. javaweb基础(35)_jdbc处理oracl大数据
  2. Linux操作系统下查找文件的几种方法
  3. 数据数组赋值_嵌入式-数组赋值
  4. 会买单吗?李楠创办的怒喵科技发布新品牌了,推出潮流无线桌面产品
  5. 又一个时代结束了!Adobe宣布在2020年彻底停止Flash更新
  6. WEB字体,多列布局和伸缩盒
  7. Codeforces Round #510 (Div. 2) AB By cellur925
  8. 【深度学习基础】张量的描述与深度学习常见张量
  9. Windows11安装安卓子系统WSA及安卓应用
  10. Java OCR文字识别(Tess4J)
  11. ubuntu-Errors were encountered while processing
  12. 通过Java生成.pfx(.p12)证书文件
  13. ​ 每周一书《数学之美 第二版》分享!
  14. linux raid 找回文件,Linux下软RAID的实现与数据恢复
  15. 洗牌算法java 剑指_扑克牌的完美洗牌算法
  16. Windows电脑上最好的3个小说阅读器
  17. JAVA SE 8安装
  18. SWUST OJ 699: Arbitrage
  19. FFmpeg命令行--视频转码
  20. Fatal Python error: Segmentation fault

热门文章

  1. python输入一个序列_Python序列合并,python
  2. 无线摄像头ftp服务器设置方法,camhi摄像头怎么连接ftp服务器
  3. SLAM--深度滤波器
  4. ORBSLAM2在ubuntu20.04上运行,实时单目摄像头(适用高版本的PCL,OpenCV4.2.0等)
  5. 容器技术Docker K8s 46 Serverless Kubernetes(ASK)详解-场景应用
  6. 单片机用C语言锯齿波,试用c语言编写一个能输出锯齿波信号的单片机c51程序
  7. android勾选控件_【Android 开发】:UI控件之复选框控件 CheckBox 的使用方法
  8. Leetcode-Implement strStr()-Python
  9. 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接---个人整理
  10. HDU 2144(最长公共子序列+并查集)