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通过为每个事务提供一个独立的数据视图来实现不同的隔离级别。在读已提交级别下,事务只能看到已经提交的更改。而在可重复读级别下,事务在其生命周期内看到的是一个一致的数据快照,不受其他事务提交的更改影响。这种机制允许数据库系统在保持高并发的同时,也能提供一定程度的数据隔离,从而减少锁的使用,提高系统的整体性能。

最后更新于