【988、MVCC怎么实现RR和RC的?】

167 阅读3分钟

MVCC(Multi-Version Concurrency Control)是一种数据库并发控制机制,它允许多个事务在同一时间并发执行而不会产生冲突。MVCC通过为每个事务保留一个或多个版本的数据来实现。在MVCC中,每个事务可以看到一个特定的数据库状态,而不是单一的全局数据库状态。

RR(Read Repeatable)和RC(Read Committed)是MVCC中的两种常见隔离级别,它们分别解决了不同类型的并发问题。

  1. Read Repeatable (RR):

    • 在RR隔离级别下,事务在其生命周期内可以多次读取同一行数据,并且在整个事务期间,它看到的数据始终保持一致。这意味着如果事务T1读取了某一行数据,那么在T1的整个生命周期内,即使其他事务对该行进行了修改,T1也只能看到最初读取的版本。
    • 实现RR的关键在于为每个事务分配一个唯一的事务标识,并在数据库中保存该标识和相关版本的数据。
    • 当一个事务读取数据时,它只能看到那个事务开始之前提交的数据版本。如果其他事务正在修改相同的数据,读取事务将等待,直到写入事务提交。
  2. Read Committed (RC):

    • 在RC隔离级别下,事务只能看到已经提交的数据。与RR不同,RC不要求事务在其整个生命周期内保持一致性视图。
    • 当事务T1读取某一行数据时,它将看到已经提交的最新版本。如果其他事务在T1的生命周期内修改了该行数据,T1将在后续读取操作中看到这些变化。
    • RC通常比RR更灵活,但可能导致某些类型的非重复读问题。

具体实现MVCC的数据库系统会有一些类似下面这样的步骤:

  1. 为每个事务分配唯一的事务标识: 通过为每个事务分配一个唯一的事务标识(通常是递增的数字或时间戳),数据库系统可以跟踪每个事务的读写操作。
  2. 为每个数据行维护多个版本: 对于每个数据行,数据库系统会维护一个版本链,其中包含了历史上的不同版本。每个版本都与一个事务标识相关联。
  3. 读取操作的处理: 当事务执行读取操作时,数据库系统根据事务的隔离级别选择适当的数据版本。对于RR,它可能选择在事务开始之前提交的最新版本;而对于RC,它选择已经提交的最新版本。
  4. 写入操作的处理: 当事务执行写入操作时,它会在数据行上创建一个新版本,并将事务标识与该版本关联。这样,其他事务可以在读取时选择避免看到未提交的数据。

需要注意的是,不同的数据库系统可能会在细节上有所不同,但上述步骤概括了MVCC的基本实现原理。