《MySQL MVCC 》

这篇具有很好参考价值的文章主要介绍了《MySQL MVCC 》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是 MySQL InnoDB 的 MVCC?

MVCC (Multi-Version Concurrency Control)是一种基于多版本的并发控制协议,只有在 InnoDB 引擎下存在。MVCC 是为了实现事务的隔离性,即通过版本号,避免同一数据在不同事务间的竞争,可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别读已提交(RC)和可重复读(RR)有效。MVCC 最大的好处,读不加锁,读写不冲突。在读多写少的应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能。

前置了解知识:

MySQL 的核心日志有哪些?

MySQL 中有七种日志文件,分别是:redo log(重做日志)undo log(回滚日志)bin log(二进制日志)、error log(错误日志)、slow query log(慢查询日志)、general log(一般查询日志),relay log(中继日志)

bin log: 就是 binary log,二进制日志文件,记录了 MySQL 所有的 DDL 和 DML (除了数据查询语句)操作,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。通过 bin log 日志我们可以做数据恢复,增量备份,主主复制和主从复制等等

undo log: 是 MySQL 用来记录事务操作的 反方向逻辑日志,顾名思义,undo log是一种用于撤销回退的日志,在事务没提交之前,MySQL 会先记录更新前的数据到 undo log 日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log 来进行回退

redo log: 是 InnoDB 存储引擎产生的,记录事务对数据页的修改,如果 mysql 挂了,重启后 InnoDB 会使用redo log 恢复数据,保证了数据的持久性

数据库的事务特性 (ACID)有哪些?

  • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行

  • 持久性(Durability): 对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障

  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的

  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致

《MySQL MVCC 》,mysql,数据库,MVCC,面试

MySQL 数据库的隔离级别有哪些,都会产生什么样的问题?

《MySQL MVCC 》,mysql,数据库,MVCC,面试

脏读

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据

不可重复读

不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。

幻读

同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。也是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。

什么是 MySQL InnoDB 当前读、快照读?

什么是当前读?

它读取的数据库记录,都是当前最新的版本,会对当前读取的数据进行加锁,防止其他事务修改数据。是悲观锁的一种操作。

如下操作都是当前读:

  • select lock in share mode(共享锁)

  • select for update(排他锁)

  • update(排他锁)

  • insert(排他锁)

  • delete(排他锁)

  • 串行化事务隔离级别

什么是快照读?

快照读的实现是基于多版本并发控制,即 MVCC,既然是多版本,那么快照读到的数据不一定是当前最新的数据,有可能是之前历史版本的数据。普通的 select 查询语句(即不加锁的 select 操作)就是快照读

重要:后续图解会进行演示

Read Committed 隔离级别:每次 select 都生成一个快照读。

Read Repeatable 隔离级别:开启事务后第一个 select 语句才是快照读的地方,而不是一开启事务就快照读。即仅在第一次执行快照读时生成

为什么需要 MVCC?

  • 读写锁的出现

读锁和读锁之间不互斥,而写锁和写锁、读锁都互斥。这样就很大提升了系统的并发能力。之后人们发现并发读还是不够

  • MVCC 概念出现

能不能让读写之间也不冲突的方法,就是读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了,不同的事务 session 会看到自己特定版本的数据。当然快照是一种概念模型,不同的数据库可能用不同的方式来实现这种功能

总结MVCC 最大的优点是读不加锁,因此读写不冲突,并发性能好,类比 Java 中的读写锁,它是会存在读写竞争的,会有这个性能问题。MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

MVCC 实现的原理

MySQL MVCC 实现原理:

具体实现主要是由 隐式字段 + undolog 版本链 + read view 的方式实现

隐式字段:

  • DB_TRX_ID:最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务 ID,这个 id 是递增的

  • DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本

图解:

id

name

DB_TRX_ID

DB_ROLL_PTR

1088

张三

1

0x1232123

undolog 版本链是什么?

在每次更新该记录后,都会将旧值放到一条 undo 日志中。随着更新次数的增多,所有的版本都会被 roll_pointer 属性连接成一条链表,这个链表就称之为版本链。

图解:

《MySQL MVCC 》,mysql,数据库,MVCC,面试

Read View 是什么?

原文:

read view

An internal snapshot used by the MVCC mechanism of InnoDB. Certain transactions, depending on their isolation level, see the data values as they were at the time the transaction (or in some cases, the statement) started. Isolation levels that use a read view are REPEATABLE READ, READ COMMITTED, and READ UNCOMMITTED.

Read View是一个数据库的内部快照,该快照被用于 InnoDB 存储引擎中的 MVCC 机制。简单点说,Read View 就是一个快照,保存着数据库某个时刻的数据信息。Read View 会根据事务的隔离级别决定在某个事务开始时,该事务能看到什么信息。就是说通过 Read View,事务可以知道此时此刻能看到哪个版本的数据记录(有可能不是最新版本的,也有可能是最新版本的)。可重复读、读已提交、读未提交,这几个隔离级别都会使用 Read View

通俗点我的理解,Readview 是一个数据结构,包含四个字段,Read View 是"快照读" SQL 执行时 MVCC 提取数据的依据和规则

ReadView 包含的内容:
  • m_ids:当前活跃的事务编号集合即还未提交

  • min_trx_id:最小活跃事务编号

  • max_trx_id:预分配事务编号,当前最大事务编号 +1

  • creator_trx_id: ReadView 创建者的事务编号

ReadView 提取数据得规则:

1、被访问的 trx_id 与 readview 中的 creator_trx_id 相同,表示当前事务在访问自己修改的记录,可见,返回;

2、被访问的 trx_id 小于 min_trx_id,表明该版本已提交,可见,返回;

3、被访问的 trx_id 大于等于 max_trx_id ,表明该版本在生成 readview 时,还未开启,不可见,返回;

4、被访问的 trx_id 在 min_trx_id 和 max_trx_id 之间,判断是否在 m_ids 中,如果在,则说明生成 readview时,该版本事务未提交,该版本不可见;如果不在,则说明生成 readview 时,该版本事务已提交可见,返回。

案例图解说明:

思考:RC、RR 两种隔离级别下,两次查询的结果是什么?

《MySQL MVCC 》,mysql,数据库,MVCC,面试

答案:

RR 级别: select1="张三" select2="张三"

RC 级别: select1="张三" select2="张小三" RC 隔离级别下出现了"不可重复读",后续讲解为什么

上述问题的产生以及 ReadView 解析:

《MySQL MVCC 》,mysql,数据库,MVCC,面试

RC 级别下得 read view 图解分析

1. 这是第两次我们进行 select 语句 read view 给我们生成的:

《MySQL MVCC 》,mysql,数据库,MVCC,面试

 2. 第一次 select 语句分析图解:

《MySQL MVCC 》,mysql,数据库,MVCC,面试

 

3. 第二次 select 语句分析图解:

《MySQL MVCC 》,mysql,数据库,MVCC,面试

 

4. 产生的问题:

在 RC 隔离级别下,两次 select 语句读取到的内容不一致问题,即证明了 MySQL 数据库的隔离级为 RC 级别下会产生不可重复读问题,再次证实前置了解知识模块中的不同隔离级别产生的问题所述。原因是 READ COMMITTD 在每一次进行普通 SELECT 操作前都会生成一个 ReadView

RR 级别下得 read view 图解分析

《MySQL MVCC 》,mysql,数据库,MVCC,面试

 

1. 连续多次快照读,ReadView 会产生复用,没有幻读问题
2. RR 级别下使用 MVCC 能避免幻读吗?

答案能,但不完全能!

特例:当两次快照读之间存在当前读,ReadView会重新生成,导致产生幻读

《MySQL MVCC 》,mysql,数据库,MVCC,面试

MVCC 总结:

所谓的MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用读已提交(READ COMMITTD)、可重复读(REPEATABLE READ)这两种隔离级别的事务在执行普通的 SELECT 操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。

这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD 在每一次进行普通 SELECT操作前都会生成一个 ReadView,而 REPEATABLE READ 只在第一次进行普通 SELECT 操作前生成一个ReadView,数据的可重复读其实就是 ReadView 的重复使用。

扩展知识:

1. "当前读" 的实现是基于 next-key lock (行记录锁+Gap间隙锁)文章来源地址https://www.toymoban.com/news/detail-835249.html

到了这里,关于《MySQL MVCC 》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql数据库面试题基础知识,Hadoop之MapReduce04,腾讯java面试流程

    该方法的执行过程比较复杂,我们慢慢来分析,首先来看下简化的时序图 3.1waitForCompletion public boolean waitForCompletion(boolean verbose ) throws IOException, InterruptedException, ClassNotFoundException { // 判断任务的状态,如果是DEFINE就提交 if (state == JobState.DEFINE) { submit(); } if (verbose) { // 监听并且

    2024年04月14日
    浏览(49)
  • java八股文面试[数据库]——MySQL死锁的原因和处理方法

    1) 表的死锁 产生原因 : 用户A访问表A(锁住了表A),然后 又访问表B ;另一个用户B访问表B(锁住了表B),然后企图 访问表A ;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。 用户A--》A表(表

    2024年02月09日
    浏览(41)
  • 从小白到数据库达人!Mysql优化让你的社招面试无往不利!

    大家好,我是小米,在这个美好的时刻又迎来了我们的技术小窝。今天,我们要聊一聊一个在数据库领域中无比重要的话题 —— Mysql 优化 !是不是感觉很兴奋呢?废话不多说,让我们直接进入今天的主题。 首先,我们要了解一下 Mysql 到底是什么。 Mysql 是一个开源的关系型

    2024年02月14日
    浏览(29)
  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(46)
  • 面试之MySQL中的mvcc

     首先需要知道什么是 MVCC? MVCC 多版本并发控制。MVCC就是通过数据行的多个版本管理来实现数据库的并发控制。这项技术是的InnoDB的事务隔离级别下执行一致性读 有了保证。换言之,就是为了查询一些正在被一个事务更新的行。并且可以看到他们被更新之前的值。查询在做查

    2024年02月16日
    浏览(24)
  • MVCC-数据库

    事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 假如A转账给B 100 元,先从A的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少

    2024年02月06日
    浏览(34)
  • 【MySQL 】MySQL 创建数据库, MySQL 删除数据库,MySQL 选择数据库

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: 以下命令简单的演示了创建数据库的过程,

    2024年02月13日
    浏览(71)
  • 【MySQL数据库】初识MySQL数据库、安装MySQL

    在今天的数字化世界中,数据是企业和个人的重要资产。管理和存储数据变得至关重要,而 MySQL 数据库是一种备受欢迎的开源关系型数据库管理系统,它提供了稳定、可靠、高性能的数据存储解决方案。本文将介绍 MySQL 数据库的基本概念和安装过程,以便初学者能够轻松上

    2024年02月08日
    浏览(56)
  • 初识MySQL数据库——“MySQL数据库”

    各位CSDN的uu们你们好呀,小雅兰好久没有更文啦,确实是心有余而力不足,最近学习的内容太难了,这篇博客又是小雅兰的新专栏啦,主要介绍的是一些MySQL数据库的知识点,下面,让我们进入初识MySQL数据库的世界吧 为什么要使用数据库 数据库与数据库管理系统 MySQL介绍

    2024年02月06日
    浏览(44)
  • 【MySQL数据库】MySQL数据库管理

    Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。 数据:(data)

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包