【MySQL】MVCC原理分析 + 源码解读 -- 必须说透_mysql mvcc


前言

如何控制并发是数据库领域中非常重要的问题之一,MySQL为了解决并发带来的问题,设计了事务隔离机制、锁机制、MVCC机制等等,用一整套机制来解决并发问题,本文主要介绍MySQL5.7版本的MVCC机制。


一、MVCC 介绍

MVCC, 全称 Multi-Version Concurrency Control(多版本并发控制)
利用多版本解决的是读写并发冲突, 做到读写冲突时, 避免加锁, 实现非阻塞的读操作, 也就是无锁并发控制.

很多数据库也都有各自的实现,像Oracle、PostgreSQL、SQLSerer、MySQL等,但没有统一的标准,所以内部实现也各有差异。


二、MySQL MVCC 介绍

MySQL的InnoDB引擎支持MVCC, 工作原理是使用数据在某个时间点的快照来实现。这意味着,无论事务运行多长时间,都可以看到数据的一致视图,也意味着不同的事务可以在同一时间看到同一张表中的不同数据! 上文回顾:MySQL事务隔离机制 – 必须说透

为了更好的理解, 我们先了解两个重要概念:当前读和快照读

  • 当前读:官方叫做 Locking Reads(锁定读取), 读取数据的最新版本. 常见的 update/insert/delete、还有 select … for update、select … lock in share mode 都是当前读.
    官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
  • 快照读:官方叫做 Consistent Nonlocking Reads(一致性非锁定读取), 也就是 MVCC 生成的 ReadView, 用于普通的 select 的语句.
    官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html
    这里需要多啰嗦一下consistent read(源码里到处可见):
    在这里插入图片描述
    • 一种读取操作, 使用数据在某个时间点的快照显示查询结果, 而不考虑同时运行的其他事务所执行的更改. 如果查询的数据已被另一个事务更改, 则会根据undo log的内容重建原始数据. 该技术避免了一些锁定问题,这些问题可以通过强制事务等待其他事务完成来减少并发性.
    • 对于REPEATABLE READ隔离级别, 快照基于执行第一次读取操作的时间. 使用READ COMMITTED隔离级别,快照将重置为每次一致读取操作的时间.
    • 一致读取是InnoDB以READ COMMITTED和REPEATABLE READ隔离级别处理SELECT语句的默认模式. 由于一致读取不会对其访问的表设置任何锁,因此在对表执行一致读取时, 其他会话可以自由修改这些表.
      官方文档:https://dev.mysql.com/doc/refman/5.7/en/glossary.html#gl
  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVCC(Multi-Version Concurrency Control,多版本并发控制)是MySQL数据库中实现事务隔离级别的一种机制。MVCC基于数据库中数据的版本来实现并发控制。每个事务在读取数据时,都会读取该数据的一个版本,而不是读取最新的数据。 MVCC的实现原理是:在每个记录(行)的后面,保存了该记录的创建时间和过期时间(或删除时间)。在读取数据时,MySQL会根据事务的隔离级别以及事务启动时的时间戳来选择合适的版本。具体来MySQL会根据以下规则选择版本: - 读未提交(Read Uncommitted):读取最新版本的数据,不考虑其他事务的并发操作。 - 读已提交(Read Committed):读取已经提交的数据的最新版本,不读取未提交的数据。 - 可重复读(Repeatable Read):在同一个事务中,读取的数据版本是该事务启动时的版本。在这个事务中,其他事务对该数据的更新不会影响该事务读取的数据版本。 - 串行化(Serializable):在同一个事务中,读取的数据版本是该事务启动时的版本。在这个事务中,其他事务对该数据的更新不会影响该事务读取的数据版本。同时,该事务对数据的更新也不会影响其他事务的并发操作。 当一个事务需要更新数据时,MySQL会创建该数据的一个新版本,并将新版本的创建时间设置为当前时间。同时,MySQL会将旧版本的过期时间设置为当前时间。 MVCC机制可以提高数据库的并发性能,但也会增加数据库的存储空间和I/O负载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值