因为当前事务隔离级别是repatable read ,而之前执行selet1的时候已经生成了readView,所以直接复用之前的readView,之前readView里的m_ids里有【100,200】,min_trx_id为100,max_trx_id为201,creator_trx_id为0。 然后从版本链中挑选可见记录,因为诸葛亮的trx_id是200,包含在m_ids,所以
在事务隔离级别 RC 和 RR (InnoDB 存储引擎的默认事务隔离级别)下,InnoDB 存储引擎使用 MVCC,但它们生成 Read View 的时机却不同: 1)在 RC 隔离级别下的 每次select 查询前都生成一个Read View (m_ids 列表) 2)在 RR 隔离级别下只在事务开始后 第一次select 数据前生成一个Read View(m_ids 列表) (6)...
1.1.2、m_up_limit_id 数据修改的事务ID所有小于这个值的数据都可见,也称低水位。这个值也是m_ids列表里边的最小值。既然都比当前存活的最小事务ID还小,那指定在当前事务创建之前已经提交了,所以就可见 1.1.3、m_creator_trx_id 当前的事务ID 1.1.4、m_ids 当前存活的事务ID列表,也就是创建当前ReadView的...
在RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。 在第一次查询时,还未提交的事务有3、4、5,那么m_ids(活跃事务ID集合)为{3,4,5},min_trx_id(最小活跃事务ID)为3,max_trx_id(预提交事务ID)为5+1=6,creator_trx_id(事务创建者ID)为5。 在第二次查询时,直接复用Re...
如果DB_TRX_ID在m_up_limit_id和m_low_limit_id之间,则需要检查DB_TRX_ID是否在m_ids列表中。如果在列表中,则不可见;如果不在列表中,则可见。 通过这种方式,MVCC可以在不加锁的情况下实现非阻塞读,提高了并发性能。 写操作与版本变更 当事务执行写操作(如UPDATE或DELETE)时,InnoDB会创建一个新的数据版本,...
在RC级别下,当前事务总是希望读取到别的事务已经提交的数据,因此当前事务事务会在执行每一次快照读的情况下都会去生成ReadView,实时更新m_ids,及时发现那些已经提交的事务。 在RR级别下,当前事务当然也能够读取到别的事务已经提交的数据,但为了避免不可重复读,因此只会在执行第一次快照读的情况下去生成ReadView,之后...
如果记录的 trx_id 不在 m_ids列表中,表示生成该版本记录的活跃事务已经被提交,所以该版本的记录对当前事务可见。 这种通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制) 在已提交读隔离级别下,每次查询都会重新生成数据快照,若其他事务已经提交了,当前事务再次查询时重新生成的数据快照...
trx_id 在 m_ids 中:说明事务尚未执行完,该行数据不可被访问。 trx_id 未在 m_ids 中:说明事务已经执行完,可以返回该行数据。 以上判断规则从 Undo Log 最新的行数据,逐行对比,直到找到匹配的数据,否则查询完未匹配上,则返回 NULL。 小结 MVCC 的实现主要依赖读视图 Read View 和 Undo Log 链,通过 Read...
m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。 min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。 max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。 creator_trx_id:表示生成该ReadView的事务的事务id。
如果在活跃事务列表m_ids找不到,说明DB_TRX_ID的事务在修改该记录行的值在当前事务创建快照前已经提交了,所以该行记录的值对当前事务是可见的。 在该行记录的DB_ROLL_PTR执行所指向的undo log取出快照数据,用快照数据的DB_TRX_ID跳到步骤1重新开始判断直到找到满足的快照版本或返回空。