Bootstrap

Mysql MVCC

MVCC

什么是MVCC

MVCC(多版本并发控制,Multi-Version Concurrency Control) 是一种用于数据库管理系统(DBMS)中的并发控制机制,它允许多个事务同时执行而不互相阻塞,并通过创建数据的多个版本来确保数据的一致性和隔离性。MVCC 是为了提高数据库并发性而设计的,它通过维护数据的不同版本来解决事务之间的冲突,从而避免了传统锁机制的性能瓶颈。

MVCC的作用

提高并发性:由于每个事务可以操作自己独立的版本,事务之间不会互相阻塞,从而提高了数据库的并发性能。
减少锁竞争:MVCC 通过避免对数据的直接锁定,减少了传统的锁机制引起的竞争和死锁问题。
实现一致性和隔离性:MVCC 保证每个事务读取到的数据都是某个时间点的一致快照,确保事务的隔离性(特别是避免“脏读”和“不可重复读”问题)。
支持高效的读操作:MVCC 使得读操作可以在不阻塞写操作的情况下进行,从而大幅提高了数据库的读性能。

理解MVCC

MVCC主要是在读已提交(RC)和可重复读(RR)中实现

在这里插入图片描述

案例:

可以看看下面的视频,讲得很好
MVCC

下面有4个事务,事务ABC做更新操作,事务D做查询操作
在这里插入图片描述
会出现如下结果:
在这里插入图片描述

原因后面会讲,这里先引入两个概念:

回滚日志和ReadView

回滚日志:

回滚日志是 MVCC 的核心组成部分之一,它记录了数据的所有修改操作,用于实现数据版本的回滚。每当事务对数据进行修改时,系统会生成一个新的数据版本,并将修改操作及其相关信息写入回滚日志。回滚日志保存着事务的修改操作以及原始数据的副本,使得在事务回滚时可以恢复数据到修改之前的状态。
在 MVCC 中,回滚日志不仅帮助管理数据的多版本控制,还使得系统能够在事务完成后保留数据的历史版本。
在这里插入图片描述

ReadView

读视图是 MVCC 中用于实现事务隔离性的关键机制。每当一个事务开始时,它会生成一个 读视图,该视图记录了该事务开始时可见的所有版本数据
快照读:
在这里插入图片描述
当前读:
在这里插入图片描述
ReadView数据结构:
在这里插入图片描述

读已提交(RC)生成的ReadView

这里每次查询都会生成readView,
在这里插入图片描述

这里的判断依据

在这里插入图片描述
因此会在一个事务中的多次查询会出现不同的结果,出现了不可重复读结果

可重复度(RR)的ReadView


RR会用第一个select生成的ReadView 也就是说只生成了一个readView ,所有能解决重复读

能解决幻读吗?

不能,因为MVCC不是使用锁的机制,如果要解决幻读,就必须要让事务顺序执行
下面举例说明
在这里插入图片描述

例子:

这里事务B两个select之间(快照读)中间有次update(当前读)这时候readView就会重新生成
在这里插入图片描述

总结:

读取已提交和可重复读级别利用了ReadView和MVCC,也就是每个事务只能读取它能看到的版本(ReadView)。

READ COMMITTED:每次读取数据前都生成一个 ReadView
REPEATABLE READ:在第一次读取数据时生成一个 ReadView

应用场景

数据库管理系统(DBMS):如 PostgreSQLMySQL(InnoDB)等都采用了MVCC技术来提高并发处理能力。
分布式系统:MVCC 也常用于分布式数据库系统中,以确保跨多个节点的事务一致性。

其他问题

MVCC如何处理事务回滚时的版本清理,以避免版本堆积导致性能问题?

如何设计一个高效的回滚日志系统以保证数据的一致性和系统的高性能?

在分布式环境中,MVCC是如何处理节点间数据一致性的?

;