MySQL--事务(2)
Read View在MVCC里如何工作
- 首先在 Read View中有四个重要字段,
- creator_trx_id: 指的是创建该Read View的事务的事务id。
- m_ids: 指的是在创建Read View时,当前数据库中活跃且未提交的事务id列表。
- min_trx_id: 创建Read View时,当前数据库中活跃且未提交事务中事务id最小的事务,也就是m_ids中的最小值。
- max_trx_id: 这个并不是m_ids的最大值,而是创建Read View时当前数据库中应该给下一个事务的id值。
- 聚簇索引的两个隐藏列:
- trx_id: 当一个事务对某条聚簇索引记录发生改动时,就会把该事务的事务id记录在trx_id隐藏列中
- roll_pointer: 每次对某条聚簇索引记录进行改动时,就会把旧版本的记录写入到undo log中,这个隐藏列是一个指针,可以通过它找到修改前的记录。
- 而在创建Read View后,我们可以将记录中的trx_id分为三种情况。
一个事务访问记录时,除了自己的更新记录总是可见,还有几种情况:
- 如果记录的trx_id值小于Read View中的min_trx_id,则表示这条记录在创建Read View前已经提交的事务生成的,所以该版本的记录对当前事务可见。
- 如果记录的trx_id值大于等于Read View中的max_trx_id,则表示这条记录在创建Read View后才启动事务生成的,所以该版本记录不可见。
- 如果trx_id在min_trx_id和max_trx_id之间,需要判断trx_id是否在m_ids列表中,如果记录的trx_id在列表中,表示生成该版本记录的活跃事务未被提交,所以该版本记录对当前事务不可见。而如果是不再列表中,则表示生成该版本记录的活跃事务已被提交,所以该版本记录对当前事务可见。
而这种通过版本控制链来控制并发事务访问同一个记录的行为叫做MVCC(多版本并发控制)。
可重复读是如何工作的?
可重复读隔离级别是启动事务时生成一个Read View,然后整个事务期间都用这个Read View。
读提交是如何工作的?
读提交隔离级别是在每次读取数据时,都会生成一个新的Read View。
评论




