【752、说说 MySQL 的 MVCC?MVCC 用在哪个隔离级别?提交读和可重复读什么时候生成 ReadView?

72 阅读2分钟

MVCC(Multi-Version Concurrency Control)是MySQL中用于实现并发控制的机制。它基于事务的提交时间和读取时间的不同版本,允许并发事务同时读取数据而不会产生冲突。每个事务在开始时会生成一个ReadView,用于确定事务开始时可见的数据版本。

MVCC主要用于MySQL的可重复读(Repeatable Read)隔离级别,它也支持读已提交(Read Committed)隔离级别。在提交读(Read Committed)隔离级别下,ReadView是在每个语句执行时生成的,因此每个语句都可以看到最新的数据。而在可重复读(Repeatable Read)隔离级别下,ReadView是在事务开始时生成的,事务期间的读操作都使用该版本的ReadView,保证事务内部的一致性。

在可重复读隔离级别下,一个事务在进行写操作后,即使在事务内部进行读操作,也只能看到写操作前的数据版本。这是因为事务开始时生成的ReadView会保持不变,事务内部的读操作都使用该ReadView,因此无法看到后续的写操作所产生的新数据版本。换句话说,在可重复读隔离级别下,一个事务在自己内部的读操作中无法看到自己的写操作的结果。

ReadView不会在事务执行期间重新生成。它在事务开始时生成,并在整个事务期间保持不变。这意味着事务内的读操作都使用同一个ReadView来确定可见的数据版本,无论事务内部进行了多少次读操作,都不会生成新的ReadView。

需要注意的是,虽然在可重复读隔离级别下事务内部的读操作无法看到自己的写操作结果,但其他并发事务在提交后会看到该写操作的结果。只有在事务提交后,其他事务才能看到该事务所做的修改。