MVCC 怎么实现 RR 和 RC 的?具体讲讲?
MVCC 怎么实现 RR 和 RC 的?具体讲讲?
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
MVCC 实现 RR 和 RC
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于实现数据库并发控制的技术。在许多数据库系统中,MVCC 用于实现不同的隔离级别,包括可重复读(Repeatable Read,RR)和读已提交(Read Committed,RC)。下面将详细介绍 MVCC 是如何实现这两种隔离级别的。
MVCC 基本原理
在 MVCC 中,每个事务都有一个唯一的时间戳(或版本号)。当事务对数据库进行读写操作时,它会根据这个时间戳来访问数据的适当版本。这样,即使多个事务同时操作同一数据,它们也不会直接相互干扰,因为每个事务都在与自己的时间戳相对应的数据快照上工作。
实现读已提交(RC)
在读已提交隔离级别下,一个事务只能看到已经提交的事务所做的更改。MVCC 通过以下方式实现 RC:
- 读操作:当事务尝试读取一条记录时,它会获取当前已提交的最新版本的记录。这意味着,如果在读取操作之前,另一个事务已经修改并提交了该记录,那么读操作将看到这个新的值。
- 写操作:当事务尝试写入一条记录时,它会创建该记录的一个新版本,并将其与自己的时间戳关联起来。这个新版本在事务提交之前对其他事务是不可见的。
通过这种方式,MVCC 确保了在 RC 隔离级别下,一个事务不会看到其他未提交事务的中间状态,只能看到已经提交的更改。
实现可重复读(RR)
在可重复读隔离级别下,一个事务在整个过程中看到的数据快照是一致的,即使其他事务提交了新的更改,这些更改也不会影响到当前事务的数据视图。MVCC 通过以下方式实现 RR:
- 读操作:当事务开始时,它会记录下一个时间戳。在事务的整个生命周期内,所有的读操作都会返回这个时间戳之前的数据版本。即使其他事务在此期间提交了新的更改,当前事务也不会看到这些更改。
- 写操作:与 RC 类似,写操作会创建新的数据版本,并与事务的时间戳关联。但是,由于其他事务在 RR 级别下不能看到这些新版本,因此它们不会影响到正在进行的事务。
通过这种方式,MVCC 确保了在 RR 隔离级别下,事务可以多次读取同一数据而得到相同的结果,即使其他事务在此期间提交了更新。
总结
MVCC 通过为每个事务提供一个独立的数据视图来实现不同的隔离级别。在读已提交级别下,事务只能看到已经提交的更改。而在可重复读级别下,事务在其生命周期内看到的是一个一致的数据快照,不受其他事务提交的更改影响。这种机制允许数据库系统在保持高并发的同时,也能提供一定程度的数据隔离,从而减少锁的使用,提高系统的整体性能。