MVCC(多版本并发控制)是一种用于数据库系统的并发控制方法。MVCC使用版本号来跟踪数据的修改历史,并使用这些版本号来控制事务之间的读写访问冲突。在MVCC中,每个事务都可以读取到一致性视图(consistent view),这个视图对应着一个时间点或者事务号。
在MySQL中,实现MVCC的主要机制是ReadView。每个事务都有自己的ReadView,它是一个可重复读(repeatable-read)级别下的快照,用于保证事务读取的数据一致性。ReadView是由InnoDB存储引擎根据当前活跃事务列表(active transaction list)和undo日志(undo log)中的信息动态生成的。在每个事务开始的时候,InnoDB会根据当前的活跃事务列表和undo日志中的信息生成一个ReadView。
但是,在一个事务中,每次执行相同的SQL语句,生成的ReadView都可能不同。这是因为在生成ReadView时,InnoDB会考虑当前已提交的事务和当前事务的隔离级别,如果当前已提交的事务列表发生了变化,或者当前事务中有写操作,那么生成的ReadView也会随之变化。因此,相同的SQL语句在不同的时间点执行,生成的ReadView可能不同。