Read View是实现MVCC的三大前提之一,那么它是在什么时候建立的
问题
Read View是实现MVCC的三大前提之一,那么它是在什么时候建立的
我的回答
在MySQL InnoDB的MVCC实现中,Read View的建立时机主要取决于事务的隔离级别。
对于'读已提交'(READ COMMITTED)隔离级别,Read View是在每次读取操作执行时都会重新创建的。这意味着同一个事务中的多次读取可能会看到不同的数据,因为每次读取都会创建新的Read View,能够看到其他已提交事务的最新修改。
而在'可重复读'(REPEATABLE READ)隔离级别下,Read View只在事务开始后的第一个读操作时创建一次,然后在整个事务过程中都使用这个Read View。这就保证了事务期间多次读取看到的数据是一致的,实现了可重复读的特性。
具体来说,Read View主要包含以下关键信息:
- 创建Read View时系统中活跃的事务ID列表(m_ids)
- 创建时刻系统中最小的活跃事务ID(m_up_limit_id)
- 创建时刻已分配的最大事务ID(m_low_limit_id)
通过这些信息,InnoDB可以判断某个版本的数据对当前事务是否可见。判断规则是:
如果数据版本的事务ID小于m_up_limit_id,说明这个版本是在Read View创建前已经提交的,对当前事务可见。
如果数据版本的事务ID大于或等于m_low_limit_id,说明这个版本是在Read View创建后才开始的事务产生的,对当前事务不可见。
如果数据版本的事务ID在两者之间,则需要查看该事务ID是否在m_ids列表中,如果在,说明创建Read View时该事务还是活跃的,对当前事务不可见;如果不在,说明创建Read View时该事务已经提交,对当前事务可见。