【814、说一下MVCC?ReadView 生成的时机?为什么读提交,同一个事务下,一样的 SQL 每次都要生成 ReadView?】

108 阅读2分钟

MVCC(Multi-Version Concurrency Control)是一种数据库并发控制机制,用于在多个并发事务访问同一数据时保证数据的一致性和隔离性。MVCC允许事务读取数据的旧版本,而不会阻塞其他事务的写操作,从而提高了数据库的并发性能。

在MVCC中,每个事务的操作不仅仅是对数据的读写,还包括生成一个ReadView。ReadView是事务在特定时刻看到数据的快照,它决定了事务可以读取哪些数据版本,以及哪些数据版本对该事务是不可见的。

ReadView的生成时机:

  1. 在读提交(Read Committed)隔离级别下,每次执行SQL语句时都会生成一个新的ReadView。
  2. 在可重复读(Repeatable Read)隔离级别下,只有在开启了事务后第一次执行SQL语句时才会生成ReadView。在该事务执行期间,多次执行SQL语句都使用同一个ReadView,保持一致性读取。

为什么读提交隔离级别下,同一个事务下,相同的SQL每次都要生成ReadView呢? 这是因为在读提交隔离级别下,每次执行SQL语句时,都需要获取当前的ReadView来确保事务只能读取已提交的数据,并且在该事务执行期间,其他事务的写操作对该事务的读操作不可见。由于Read提交级别下事务每次读取的数据版本都不同,因此每次执行SQL时都需要生成新的ReadView。

相反,在可重复读隔离级别下,事务在执行期间保持一致的ReadView,不会看到其他事务提交的数据变化。因此,同一个事务在可重复读隔离级别下多次执行相同的SQL,使用的都是同一个ReadView,以保持数据的一致性读取。

总结: MVCC允许数据库在并发环境下保持高性能和隔离性。ReadView是MVCC机制中重要的概念,用于确定事务在特定时刻可见的数据版本。在读提交隔离级别下,同一个事务的相同SQL每次都生成新的ReadView,而在可重复读隔离级别下,同一个事务的相同SQL保持一致的ReadView,以确保数据的一致性和隔离性。