文章目录
- 1、RC隔离级别下,在事务中每一次执行快照读时生成ReadView
- 2、先来看第一次快照读具体的读取过程:
- 3、再来看第二次快照读具体的读取过程:
1、RC隔离级别下,在事务中每一次执行快照读时生成ReadView
我们就来分析事务5中,两次快照读读取数据,是如何获取数据的?
在事务5
中,查询了两次id为30的记录,由于隔离级别为Read Committed
,所以每一次进行快照读
都会生成一个ReadView,那么两次生成的ReadView如下。
那么这两次快照读在获取数据时,就需要根据所生成的ReadView以及ReadView的版本链访问规则
,到undolog版本链
中匹配数据,最终决定此次快照读返回的数据。
2、先来看第一次快照读具体的读取过程:
在进行匹配时,会从undo log的版本链
,从上到下进行挨个匹配:
- 先匹配
这条记录,这条记录对应的trx_id为4
,也就是将4带入右侧的匹配规则中。 ①不满足 ②不满足 ③不满足 ④也不满足 ,都不满足,则继续匹配undo log版本链的下一条。
- 再匹配第二条
,这条记录对应的trx_id为3
,也就是将3带入右侧的匹配规则中。①不满足 ②不满足 ③不满足 ④也不满足 ,都不满足,则继续匹配undo log版本链的下一条。
- 再匹配第三条
,这条记录对应的trx_id为2
,也就是将2带入右侧的匹配规则中。①不满足②满足
终止匹配,此次快照读,返回的数据就是版本链中记录的这条数据。
3、再来看第二次快照读具体的读取过程:
在进行匹配时,会从undo log的版本链
,从上到下进行挨个匹配:
- 先匹配
这条记录,这条记录对应的trx_id为4
,也就是将4带入右侧的匹配规则中。 ①不满足 ②不满足 ③不满足 ④也不满足 ,都不满足,则继续匹配undo log版本链的下一条。
- 再匹配第二条
,这条
记录对应的trx_id为3
,也就是将3带入右侧的匹配规则中。①不满足②满足
。终止匹配,此次快照读,返回的数据就是版本链中记录的这条数据。