MVCC详解,深入浅出简单易懂
一、什么是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详解,深入浅出简单易懂相关推荐
- 机器学习经典算法决策树原理详解(简单易懂)
↑ 点击上方[计算机视觉联盟]关注我们 最经典的决策树算法有ID3.C4.5.CART,其中ID3算法是最早被提出的,它可以处理离散属性样本的分类,C4.5和CART算法则可以处理更加复杂的分类问题, ...
- java函数方法详解(简单易懂)
方法(函数) 函数的组成是: 访问修饰符 返回值 函数名(形式参数) {函数内容; } 更多java函数方法详解视频课程学习地址:https://ke.qq.com/course/149432 有技 ...
- RSA算法原理详解(简单易懂)
本文主要是简单高效地讲解RSA算法的基本数学原理以及加解密的步骤,算法背景以及设计到的数学证明省略.本文主要参考wikipedia和博文<非对称加密算法–RSA加密原理>. 非对称公钥加密 ...
- 红黑树,超强动静图详解,简单易懂
写在前面 红黑树,对很多童鞋来说,是既熟悉又陌生.学校中学过,只了解大概:工作中不怎么使用,但面试又是重点.每次需要查看红黑树内容时都很难以更生动形象的方式来理解其内容.没错,本文内容就是要解决这个问 ...
- HTTP协议的详解(简单易懂)
HTTP是什么 一.HTTP是什么 HTTP全称为Hyper Text Transfer Protocol,被译为超文本传输协议,是互联网上应用最为广泛的-种网络协议. **HTTP协议是在Web上进 ...
- Java数据结构之双向链表(配图详解,简单易懂)
⚡️前言⚡️ 本笔记针对无头双向链表的实现来展开,在阅读该笔记时,建议读者结合博主的单链表笔记一起阅读,两者多有相似之处,结合阅读便于理解总结
- latex图片调整大小(详解,简单易懂)
直接看例子: 如何图片自动缩放: 双栏文章或者单栏文章 都适用: 让图片填满整栏: includegraphics[width=1.0\columnwidth]{myimage.png} 让图片只占整 ...
- php小程序地图处理,微信小程序 地图map详解及简单实例
微信小程序 地图map 微信小程序map 地图属性名类型默认值说明longitudeNumber中心经度 latitudeNumber中心纬度 scaleNumber1缩放级别 markersArra ...
- java对文件的操作详解_Java 对 Properties 文件的操作详解及简单实例
Java 对 Properties 文件的操作详解及简单实例 发布于 2020-8-7| 复制链接 摘记: Java 对 Properties 文件的操作简介在 Java 中,我们常用 java.ut ...
- mysql 实例复制_MYSQL教程MySQL 复制详解及简单实例
<MysqL教程MysqL 复制详解及简单实例>要点: 本文介绍了MysqL教程MysqL 复制详解及简单实例,希望对您有用.如果有疑问,可以联系我们. MysqL 复制详解及简单实例 主 ...
最新文章
- boost::contract模块实现private protected的测试程序
- ImageView、Bitmap的属性android:scaleType
- 一个不成功人士的“成功之道”
- 学习分布式不得不会的BASE理论
- 易错丨Oracle 每日一题系列合集
- OPPO海外功臣realme将回归国内 目标竞争对手:红米和荣耀
- DS8100存储系统安装配置之个人总作篇
- 刷脸即可解锁让iDevice取证不再难如登天
- 蓝桥杯第五届JavaC组杨辉三角问题解决方法
- SQlite数据库的C编程接口(六) 返回值和错误码(Result Codes and Error Codes) ——《Using SQlite》读书笔记
- java es score_elasticsearch系列(七)java定义score(示例代码)
- winform图片操作
- 如何调整Exadata DB节点文件系统大小
- python省略号用法
- 赞叹AI的力量-TopazLabs 全家桶使用经历
- 逆序字符串 和 字符串的逆序输出 的区别~
- 亚马逊链接那些非正常原因变狗的情况你都了解吗?
- php 判断姓名,姓名的判断和命名方法
- 【数据安全案例】案例汇总
- Problem K.将军棋