我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL多版本并发控制MVCC深入学习

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL多版本并发控制MVCC深入学习

MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制。是 innodb 实现事务并发与回滚的重要功能。锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销.

具体实现是在数据库的每一行中,额外添加三个字段:

  1. DB_TRX_ID : 记录插入或更新该行的最后一个事务的事务ID
  2. DB_ROLL_PTR : 指向改行对应undolog 的指针
  3. DB_ROW_ID : 单调递增的ID,他就是AUTO_INCREMENT的主键ID

快照读

像不加锁的select操作就是快照读,快照读的出现是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC。可以认为 MVCC 是行锁的一个变种,在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

当前读

读取的是当前的数据,不需要通过undo log回溯到事务开启前的状态。读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

数据库并发场景有三种,分别为:

  • 读-读:不存在任何问题,也不需要并发控制
  • 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
  • 写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失

说白了 MVCC 就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现

MVCC的出现就是大佬们不满意用悲观锁去解决读-写冲突问题,所以有两个方案:

  • MVCC + 悲观锁
    MVCC解决读写冲突,悲观锁解决写写冲突
  • MVCC + 乐观锁
    MVCC 解决读写冲突,乐观锁解决写写冲突

MVCC实现原理

三个隐藏字段

  • DB_TRX_ID
    6 字节,最近修改(修改/插入)事务 ID:记录创建这条记录/最后一次修改该记录的事务 ID
  • DB_ROLL_PTR
    7 字节,回滚指针,指向这条记录的上一个版本(存储于 rollback segment 里)
  • DB_ROW_ID
    6 字节,隐含的自增 ID(隐藏主键),如果数据表没有主键,InnoDB 会自动以DB_ROW_ID产生一个聚簇索引

版本链 / undo log

因为undo log会记录事务前老版本数据,然后行记录中回滚指针会指向老版本位置,如此形成一条版本链。Read View 会一直遍历链表的DB_TRX_ID,直到找到满足特定条件的 DB_TRX_ID。那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新”老版本“

Read View

是事务开启时,当前所有活跃事务(还未提交的事务)的一个集合。或者说Read View 就是事务进行快照读操作的时候生产的读视图 (Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的 ID

三个Read View重要结构:

  • trx_list(名称我随意取的)
    一个数值列表
    用于维护 Read View 生成时刻系统 正活跃的事务 ID 列表
  • up_limit_id
    是 trx_list 列表中事务 ID 最小的 ID
  • low_limit_id

ReadView 生成时刻系统尚未分配的下一个事务 ID ,也就是 目前已出现过的事务 ID 的最大值 + 1

为什么是 low_limit ? 因为它也是系统此刻可分配的事务 ID 的最小值

MVCC实现的整体流程:

总结

  • 应对高并发事务, MVCC比单纯的加锁更高效
  • MVCC只在 读已提交 和 可重复读 两个隔离级别下工作
  • 读已提交隔离级别下,会在每次快照读(查询)都生成一个Read View,可重复读只在事务开始时生成一个Read View,以后每次查询都用这个Read View,以此实现不同隔离级别。

参考:

【MySQL笔记】正确的理解MySQL的MVCC及实现原理_(推荐)

MySQL · 引擎特性 · InnoDB 事务系统 (taobao.org)

mvcc详解 - 简书 (jianshu.com)

到此这篇关于MySQL多版本并发控制MVCC深入学习的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL多版本并发控制MVCC深入学习

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL多版本并发控制MVCC详解

目录1.什么是MVCC2快照读与当前读2.1 快照读2.2当前读3.复习3.1 再谈隔离级别3.2 隐藏字段、Undo Log版本链4、MVCC实现原理之ReadView4.1什么是ReadView4.2 设计思路4.3 ReadView的
2022-07-25

MySQL多版本并发控制——MVCC机制分析

原文:https://www.cnblogs.com/buptleida/p/14283943.html
MySQL多版本并发控制——MVCC机制分析
2019-04-27

Mysql InnoDB多版本并发控制MVCC详解

目录一丶为什么需要事务隔离级别1.实现事务隔离的方式:串行执行2.实现事务隔离的方式:可串行执行二丶并发事务执行的问题:脏写,脏读,不可重复读,幻读1.脏写2.脏读3.不可重复读4.幻读三丶隔离级别1.Read UnCommitted 读未
2022-11-29

mysql的MVCC多版本并发控制的实现

1 什么是MVCC MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题。举个例子,程序员A正在读数据库中
2022-05-31

【Mysql】MVCC版本机制的多并发

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 🛸Mysql专栏:Mys
2023-08-24

详解MySQL多版本并发控制机制(MVCC)源码

目录一、前言二、MVCC(多版本并发控制机制)2.1、Repeatable Read2.2、Read Commit2.3、MVCC的优势三、MVCC(实现机制)3.1、select运行栈3.2、read_view的创建过程3.3、行版本可见
2022-05-22

怎么在mysql中实现MVCC多版本的并发控制

今天就跟大家聊聊有关怎么在mysql中实现MVCC多版本的并发控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 什么是MVCCMVCC全称是: Multiversion conc
2023-06-14

⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ InnoDB存储引擎 ⑩⑧【MySQL】详解I
⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制
2023-12-22

Mysql MVCC多版本并发控制的知识点有哪些

这篇文章主要介绍了Mysql MVCC多版本并发控制的知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Mysql MVCC多版本并发控制的知识点有哪些文章都会有所收获,下面我们一起来看看吧。1、MVC
2023-06-30

MySQL的多版本并发控制MVCC实现方法是什么

这篇文章主要讲解了“MySQL的多版本并发控制MVCC实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL的多版本并发控制MVCC实现方法是什么”吧!什么是MVCCMVCC
2023-06-22

如何进行MySQL多版本并发控制MVCC底层原理解析

本篇文章为大家展示了如何进行MySQL多版本并发控制MVCC底层原理解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1 事务并发中遇到的问题1.1 脏读当一个事务读取到了另外一个事务修改但未提交的
2023-06-22

《MySQL高级篇》十四、多版本并发控制

文章目录 1. 什么是MVCC2. 快照读与当前读2.1 快照读2.2 当前读 3. 复习3.1 再谈隔离级别3.2 隐藏字段、Undo Log版本链 4. MVCC实现原理之ReadView4.1 什么是ReadVie
2023-08-17

编程热搜

目录