一、什么是MVCC?

mvcc,也就是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。

数据库并发有以下几种场景:

  • 读-读:不存在任何问题。
  • 读-写:有线程安全问题,可能出现脏读、幻读、不可重复读。
  • 写-写:有线程安全问题,可能存在更新丢失等。

mvcc解决的就是读写时的线程安全问题,线程不用去争抢读写锁

mvcc所提到的读是快照读,也就是普通的select语句。快照读在读写时不用加锁,不过可能会读到历史数据。

还有一种读取数据的方式是当前读,是一种悲观锁的操作。它会对当前读取的数据进行加锁,所以读到的数据都是最新的。主要包括以下几种操作:

  • select lock in share mode(共享锁)
  • select for update(排他锁)
  • update(排他锁)
  • insert(排他锁)
  • delete(排他锁)

二、MVCC的实现

1.回顾事务的特性

  • 原子性:通过undolog实现。
  • 持久性:通过redolog实现。
  • 隔离性:通过加锁(当前读)&MVCC(快照读)实现。
  • 一致性:通过undolog、redolog、隔离性共同实现。

2.回顾事务的隔离级别

  • 读未提交:允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读
  • 读已提交:允许读取已经提交的数据。可能会导致幻读和不可重复读
  • 可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。可能会导致幻读
  • 可串行化:最高隔离级别。

在读已提交和可重复读隔离级别下的快照读,都是基于MVCC实现的!

3.mvcc实现原理

​ mvcc的实现,基于undolog版本链readview

在mysql存储的数据中,除了我们显式定义的字段,mysql会隐含的帮我们定义几个字段。

  • trx_id:事务id,每进行一次事务操作,就会自增1。

  • roll_pointer:回滚指针,用于找到上一个版本的数据,结合undolog进行回滚。

什么是readview呢?

当我们用select读取数据时,这一时刻的数据会有很多个版本(例如上图有四个版本),但我们并不知道读取哪个版本,这时就靠readview来对我们进行读取版本的限制,通过readview我们才知道自己能够读取哪个版本

在一个readview快照中主要包括以下这些字段:

对readview中的参数做一些解释

m_ids:活跃的事务就是指还没有commit的事务。

max_trx_id:例如m_ids中的事务id为(1,2,3),那么下一个应该分配的事务id就是4,max_trx_id就是4。

creator_trx_id:执行select读这个操作的事务的id。

readview如何判断版本链中的哪个版本可用呢?(重点!)

从上到下分别为(1)(2)(3)(4),依次进行解释

trx_id表示要读取的事务id

(1)如果要读取的事务id等于进行读操作的事务id,说明是我读取我自己创建的记录,那么为什么不可以呢。

(2)如果要读取的事务id小于最小的活跃事务id,说明要读取的事务已经提交,那么可以读取。

(3)max_trx_id表示生成readview时,分配给下一个事务的id,如果要读取的事务id大于max_trx_id,说明该id已经不在该readview版本链中了,故无法访问。

(4)m_ids中存储的是活跃事务的id,如果要读取的事务id不在活跃列表,那么就可以读取,反之不行。

4.mvcc如何实现RC和RR的隔离级别

(1)RC的隔离级别下,每个快照读都会生成并获取最新的readview

(2)RR的隔离级别下,只有在同一个事务第一个快照读才会创建readview,之后的每次快照读都使用的同一个readview,所以每次的查询结果都是一样的

5.幻读问题

  • 快照读:通过mvcc,RR的隔离级别解决了幻读问题,因为每次使用的都是同一个readview。
  • 当前读:通过next-key锁(行锁+gap锁),RR隔离级别并不能解决幻读问题

MVCC详解,深入浅出简单易懂相关推荐

  1. 机器学习经典算法决策树原理详解(简单易懂)

    ↑ 点击上方[计算机视觉联盟]关注我们 最经典的决策树算法有ID3.C4.5.CART,其中ID3算法是最早被提出的,它可以处理离散属性样本的分类,C4.5和CART算法则可以处理更加复杂的分类问题, ...

  2. java函数方法详解(简单易懂)

    方法(函数) 函数的组成是: 访问修饰符 返回值 函数名(形式参数) {函数内容; } 更多java函数方法详解视频课程学习地址:https://ke.qq.com/course/149432  有技 ...

  3. RSA算法原理详解(简单易懂)

    本文主要是简单高效地讲解RSA算法的基本数学原理以及加解密的步骤,算法背景以及设计到的数学证明省略.本文主要参考wikipedia和博文<非对称加密算法–RSA加密原理>. 非对称公钥加密 ...

  4. 红黑树,超强动静图详解,简单易懂

    写在前面 红黑树,对很多童鞋来说,是既熟悉又陌生.学校中学过,只了解大概:工作中不怎么使用,但面试又是重点.每次需要查看红黑树内容时都很难以更生动形象的方式来理解其内容.没错,本文内容就是要解决这个问 ...

  5. HTTP协议的详解(简单易懂)

    HTTP是什么 一.HTTP是什么 HTTP全称为Hyper Text Transfer Protocol,被译为超文本传输协议,是互联网上应用最为广泛的-种网络协议. **HTTP协议是在Web上进 ...

  6. Java数据结构之双向链表(配图详解,简单易懂)

    ⚡️前言⚡️ 本笔记针对无头双向链表的实现来展开,在阅读该笔记时,建议读者结合博主的单链表笔记一起阅读,两者多有相似之处,结合阅读便于理解总结

  7. latex图片调整大小(详解,简单易懂)

    直接看例子: 如何图片自动缩放: 双栏文章或者单栏文章 都适用: 让图片填满整栏: includegraphics[width=1.0\columnwidth]{myimage.png} 让图片只占整 ...

  8. php小程序地图处理,微信小程序 地图map详解及简单实例

    微信小程序 地图map 微信小程序map 地图属性名类型默认值说明longitudeNumber中心经度 latitudeNumber中心纬度 scaleNumber1缩放级别 markersArra ...

  9. java对文件的操作详解_Java 对 Properties 文件的操作详解及简单实例

    Java 对 Properties 文件的操作详解及简单实例 发布于 2020-8-7| 复制链接 摘记: Java 对 Properties 文件的操作简介在 Java 中,我们常用 java.ut ...

  10. mysql 实例复制_MYSQL教程MySQL 复制详解及简单实例

    <MysqL教程MysqL 复制详解及简单实例>要点: 本文介绍了MysqL教程MysqL 复制详解及简单实例,希望对您有用.如果有疑问,可以联系我们. MysqL 复制详解及简单实例 主 ...

最新文章

  1. 你知道element中el-table的列名中不能含有 . 吗?
  2. MySQL的版本以及版本号
  3. 科大星云诗社动态20210911
  4. 嵌入式linux, CAN 驱动有关问题
  5. 管理飞扬跋扈的技术部
  6. python寻找多数元素_寻找多数元素
  7. unity许可证不可用_不可思议之梦蝶从PC版移植到Nintendo Switch经验分享(上)
  8. php 正则表达式 文档,php的正则表达式完全手册
  9. Zigbee 学习计划——第1天——第一个程序
  10. servlet篇 之servlet实现
  11. android访问局域网电脑,如何设置电脑使安卓手机能访问局域网共享的文件
  12. 盲子强巴(连载)二、
  13. 这是初次的感觉 好象天空般晴朗
  14. cad怎么倒圆角_学不好CAD怎么办?9个实用的CAD技巧,让你轻松玩转CAD
  15. 软件测试面试题:在一个页面上,点击一个链接之后不会在当前页面上打开此链接而是新开一个窗口打开此页面。
  16. 计算机常用软件英文读音,常用软件,software,音标,读音,翻译,英文例句,英语词典...
  17. python怎么取共轭_python矩阵运算,转置,逆运算,共轭矩阵实例
  18. 强强联手 东钱湖变身高端度假区
  19. css禁止图片保存,CSS的图片保存后面目全非?教你快速解决
  20. CockroachDB简介

热门文章

  1. ramos一键处理多合一_【RAMOS一键批处理多合一 V4.0】在线制作P驱R驱F驱内存系统工具【win系列通用】...
  2. RAID0---RAID6
  3. python股票数据预处理_PythonStock(14):使用pandas 批量处理股票数据,批量计算股票指标...
  4. django报错Did you install mysqlclient?
  5. oracle中wip差异原因,WIP 工费差异--月末分摊
  6. java 获取文件名长度_利用Java文件类File的方法,获取磁盘文件的文件名、长度、大小等特性...
  7. 前端面试html5新特性,前端面试基础-html篇之H5新特性
  8. Python算法二分查找之重复元素列表
  9. ENVI中基于Modis影像提取NDVI处理步骤
  10. 周报(0213-0219)