前置知识

当前读与快照读

当前读

什么是当前读:读取的是最新的数据,不会读到老数据。

何时触发:update、insert、delete、select lock in share mode、select for update时,总是当前读。

快照读

什么是快照读:读取的是历史版本,不是最新的数据。

何时触发:select



这些关系一定要搞清楚!

事务的ACID

原子性:事务要么全部成功,要么全部失败。实现:undolog回滚日志实现。相当于存储在磁盘中的历史记录链、还有一个更官方的名字:快照

一致性:由另外三个共同达到一致性。

隔离性:事务并发执行时内部操作不能互相干扰。实现:锁实现。

持久性:事务一旦提交,对数据库的影响应该是永久的。实现:redolog实现。

Innodb引擎的日志

1、undolog

作用:保存历史快照。

目的:实现原子性,在MVCC中也起到了一定的作用。

2、redolog

作用:预写日志。

目的:为了高效实现持久性,将数据持久化。

详解:首先,在执行数据更新时,效率是低的,目前几乎所有软件硬件的瓶颈,都卡在了IO层面。IO有两种:顺序读写随机读写。那明明是解释redolog的,怎么就说起了IO呢?这要先明确一点,就是顺序读写与随机读写的效率是谁快谁慢的问题。顺序读写:顾名思义,就是顺序向尾部一次添加数据,属于append的操作,不需要查找。随机读写:需要指针的移动查找。所以很明显,顺序读写的效率是要远高于随机读写的。举个例子,比如在一家饭店,中午有人来吃饭,这家店允许赊账,所以很多人会选择赊账,而店主呢,就把所有的赊账信息记录在一本厚厚的本子里,假设里面记了一万条赊账信息。好了,中午最繁忙的时候,所有员工都在忙着工作,如果有人要赊账,怎么办?根本没机会一个一个仔细找记录。所以很自然的就会想到,我在墙上装个黑板,或者单独在一张纸上列出来今天的赊账名单。等不忙了,我再慢慢地把名单记录到本子里。所以,现在已经很明显了,redolog就是顺序读写,它快速记录数据,然后数据再由顺序读写区域慢慢向随机读写区域转换。这就是WAL:预写日志

redolog是Innodb引擎的日志,而MySQLserver中自带的日志中有binlog,所以它俩是共存的,所以在运行时,必须保证一致性,因为binlog是MySQL主从复制时向从机同步信息的,如果不写binlog,那么从机会出问题,但是应该先写哪一个呢?先写哪个都会出问题!一旦写第一个时断电,就会造成主机与从机不一致。解决的方法是给redolog加个状态,当redolog写完数据后,给它状态为prepare,然后去写binlog,当binlog写完后,再把redolog的状态从prepare改为commit。这就是两阶段提交

MVCC

宏观来看,MVCC就是解决事务的隔离性的问题的。

MySQL的并发场景

MySQL的并发场景有三种:读读读写写写

读读:不存在数据安全问题。

读写:存在数据安全问题。如脏读、不可重复读、幻读。

写写:存在数据安全问题。如丢失更新。

而MVCC则是以不加锁的方式解决读写冲突问题。

MVCC的组成部分

表的隐藏字段:数据库表在定义时除了自己声明的字段,还会包括一些隐藏字段,包括有:

DB_TRX_ID :最近修改事务ID。指创建这条记录或最后一次修改这条记录的事务id。

DB_ROLL_PTR :回滚指针。指向记录的上一个版本,即指向undolog首条记录。

DB_ROW_ID :隐藏主键。如果表没有主键,自动生成一个6字节的row id。

readview

快照读时会产生readview,即select时会产生readview。



举个demo:



当select时,产生了快照读,此时生成的readview可以看到。

而如何看能否读取到值呢?MySQL有可见性算法。



再举一个demo



对比一下,如果按照我们的判断,可以发现蓝色的readview与第一个demo中的readview一模一样。但是问题在于,蓝色的select是不能读取到修改之后的数据的。这当然是因为蓝色的readview是错误的,它真正的readview其实就是黄色的readview,也就是下图

结论

所以,隔离级别解决数据不可重复读的关键,在于MVCC生成readview的机制或者时机,如果是读已提交级别RC,每次快照读都会生成readview,所以会产生不可重复读的问题。如果是可重复读隔离级别RR,只会在第一次快照读时产生readview,不会有不可重复读的问题。

至此,MVCC结束

至于幻读问题,则需要加锁来解决,幻读产生的根本原因在于:当前读和快照读一起使用!如果一个事务中只有快照读,那么永远不会出现幻读问题。

MVCC多版本并发控制的理解的更多相关文章

  1. InnoDB学习(五)之MVCC多版本并发控制

    MVCC多版本并发控制,是一种数据库管理系统并发控制的方法.MVCC多版本并发控制下,数据库中的数据会有多个版本,分别对应不同的事务,从而达到事务之间并发数据的隔离.MVCC最大的优势是读不加锁,读写 ...

  2. MVCC多版本并发控制

    MVCC多版本并发控制 爱情小傻蛋关注 82019.09.28 23:23:37字数 4,740阅读 91,421 前提概要 什么是MVCC 什么是当前读和快照读? 当前读,快照读和MVCC的关系 M ...

  3. mysql的MVCC多版本并发控制机制

    MVCC多版本并发控制机制 全英文名:Multi-Version Concurrency Control MVCC不会通过加锁互斥来保证隔离性,避免频繁的加锁互斥. 而在串行化隔离级别为了保证较高的隔 ...

  4. 【Mysql】深入理解 MVCC 多版本并发控制

    MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大, ...

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

    概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...

  6. [MySQL] MVCC 多版本并发控制实现的事务

    1.没有一个统一的实现标准,实现了非阻塞的读操作,写操作也只锁定必要的行2.通过保存数据在某个时间点的快照实现的3.典型的有乐观并发控制和悲观并发控制4.innodb的mvcc是每次事务都有递增的版本 ...

  7. MVCC 多版本并发控制

    关于事务的介绍暂且不谈. InnoDB行级锁,虽然在很大程度上提高了事务的并发性,但是终究还是要耗费很大的.为了更进一步的提高并发性同时降低开销,存储引擎会同时实现MVCC. InnoDB实现MVCC ...

  8. 聊聊MVCC多版本并发控制

    一.介绍 MVCC只在RR和RC 2个隔离级别下才能工作.MySQL的大多数事务存储引擎实现的都不是简单的行级锁机制.基于提升并发性能的考虑,它们一般都同时实现了MVCC. 通俗的来讲,MVCC是行级 ...

  9. 针对MySQL的MVCC多版本并发控制的一些总结

    MVCC MVCC细节太多,我直接备忘一下总结: MVCC就是通过事务的ID与行数据的版本(修改事务的ID)进行比较(通过redo log可以回溯版本)得出哪些版本的行数据可见和不可见而实现的事务隔离 ...

随机推荐

  1. 将CSV格式或者EXCEL格式的文件导入到HIVE数据仓库中

    学习内容:数据导入,要求将CSV格式或者EXCEL格式的文件导入到HIVE数据仓库中: ①hive建表:test1 create table test1 (InvoiceNo String, Stoc ...

  2. 戏说领域驱动设计(廿七)——Saga设计模型

    上一节我们讲解了常用的事务,也提及了Saga,这是在分布式环境下被经常使用的一种处理复杂业务和分布式事务的设计模式.本章我们的主要目标是编写一个简单版本的Saga处理器,不同于Seata框架中那种可独 ...

  3. PostgreSQL(一) 编译安装运行

    原创,如转发需注明出处. 多年没写博客,一直用的个人笔记软件,最近准备阅读PostgreSQL源码,故记录.(这两年PostgreSQL数据库在某些环境下是比较火的,原因想必大家都清楚.) Postg ...

  4. [第18届 科大讯飞杯 J] 能到达吗

    能到达吗 题目链接:牛客5278 J 能到达吗 Description 给定一个 \(n\times m\) 的地图,地图的左上角为 \((1, 1)\) ,右下角为 \((n,m)\). 地图上有 ...

  5. Go微服务框架go-kratos实战04:kratos中服务注册和服务发现的使用

    一.简介 关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章. 作为服务中心的软件有很多,比如 etcd,consul,nacos,zookeeper 等都可以作为服务中心. ...

  6. python生产exe文件yi以及解释器配置等

    原文链接:https://blog.csdn.net/weixin_42691768/article/details/81044666 https://www.cnblogs.com/paulwhw/ ...

  7. c++ 快速乘

    First 在一些数学题中,两个数相乘运算很多,同时又很容易溢出,如两个 long long 相乘 今天本蒟蒻来总结一下快速乘的两种方法 1:二进制 和快速幂的原理一样,优化一个一个加的算法,复杂度\ ...

  8. docker-compose 搭建 Prometheus+Grafana监控系统

    有关监控选型之前有写过一篇文章: 监控系统选型,一文轻松搞定! 监控对象 Linux服务器 Docker Redis MySQL 数据采集 1).prometheus: 采集数据 2).node-ex ...

  9. camunda流程引擎概念术语

    前言 本文重点介绍开源流程引擎camunda的核心概念,这些概念同样适用于JBMP.Activiti.Flowable流程引擎,了解这些基本概念和原理,使用流程引擎API将更得心应手. 一.Proce ...

  10. 1.3 操作系统的第三个功能——存储管理功能 -《zobolの操作系统学习札记》

    1.3 操作系统的第三个功能--存储管理功能 作者zobol:关于操作系统概论-存储管理功能,我给出下列问题: 目录 1.3 操作系统的第三个功能--存储管理功能 问1:操作系统的文件管理系统主要是负 ...