关于快照读的read view
来源:3-16 锁模块之当前读和快照读
YogurtJ
2020-03-05
老师您好,在课程中您有提到说
在RU,RC级别下的快照读,之所以是每次都能读取到最新的数据,是因为在RC和RU级别下,每一次调用快照读的时候都会创建一个新的快照(read-view)
“read view遵循一个可见性算法(RR隔离级别下): 主要是将要修改数据的DB_TRX_ID取出来,与系统其它活跃事务id作对比,如果大于或者等于这些id的话,就通过回滚指针去取出undo log中上一层的DB_TRX_ID,直到修改数据的事务id小于这些活跃事务id为止,这样就保证了我们当前获取的数据版本是当前可见的最稳定的数据版本.
而我的疑问是,在RC和RR级别下 就算每一次都创建了新的快照,我不管创建几次快照,只要我还在同一个事务内,我当前要修改的数据的DB_TRX_ID并不会发生变化呀。那得到的read-view不就又是一样了?
希望祥仔可以帮忙解答疑惑~,感谢
2回答
-
翔仔
2020-03-06
同学好,虽然每次打开read_view的时候,当前的DB_TRX_ID不会发生变化,但是请注意我视频说的,是递归取获取到最小的id,也就是最稳定的版本。。所以取出来的DB_TRX_ID不是当前的呀,而是已经发生修改的。具体你可以研究一下源码
https://blog.csdn.net/joy0921/article/details/80128857
00 -
YogurtJ
提问者
2020-03-06
个人暂且的想法是,从结果反推,RC级别下每次快照读,都会进行一个新的快照,从而保证可以读到最新的数据,
那每次进行快照的时候,肯定有一个变量是变化的,而这个变量不应该是老师课上讲的 ”修改数据的DB_TRX_ID " 因为对于同一个事务而言,不管什么时候快照,当前的事务ID并不会发生变化。
---
我认为在每次快照中会发生变化的变量是,当前活跃事务的最大id,应该是拿这个id去和undo log里面的DB_TRX_ID 去对比,如果比当前DB_TRX_ID小的话,就通过DB_ROLLBACK_POINTER 继续向下寻找,从而确定这一次的read-view 数据可见范围 是什么
00
相似问题