关于undo日志删除时机和建立read view 时选择版本算法疑惑

来源:3-16 锁模块之当前读和快照读

坐看落花

2020-04-08

  1. 对于undo update 日志删除的时机
    对于purge线程来说 它删除日志是通过扫描方式进行选择性删除, 此时删除的判断依据是什么? 当前undo日志没有被标记为快照并且是事务结束的版本, 那么当前的记录update日志和更早期update的日志就会被删除, 问题点在于它如何区分提交和未提交的? 还是通过undo日志记录的事务id和系统的活跃id做对比吗? 但是如果事务结束了, 但是比活跃事务id大怎么办呢
  2. 对于建立快照的算法疑惑
    老师视频中说建立快照是通过递归的方式, 从当前数据的事务id 和 系统活跃id做对比, 如果大于等于活跃id, 就去undo日志,根据db_roll_ptr 取记录的undo日志数据, 再判断该undo日志记录的事务id和系统活跃id, 重复上述过程, 但是如果有下面这样一个场景
    场景: 事务A快照读id=1的记录, 事务B在事务A之后创建, 并修改id=1的记录, 建立undo日志, 并进行提交, 此时undo日志不会删除事务A建立的快照版本的undo日志, 此时又有一个新建的事务C 快照读读取id=1的记录,
    问题: 如果是拿记录的事务id和当前系统的活跃id做对比, 此时事务C应该建立快照读取的数据应该是事务A那个版本的快照, 但是测试发现不是的, 事务c的快照是最新的提交版本数据
    这两个问题有共通的地方 就是事务结束判断, 问题描述比较长, 但是描述的还算清晰, 麻烦老师了
写回答

1回答

翔仔

2020-04-09

同学好,你这个问题需要仔细看源码去了解才可以,我这周在赶录新出的spring源码课程,外加平日加班,暂时没有时间去研究,先留做遗留问题来处理,这个不着急的话下周有时间我再看看,我先把问题记录下来,感谢支持与理解:)

0
5
坐看落花
回复
翔仔
这里我感觉 创建readView的时候 给 引用的undo数据段 加上引用次数. 提交事务, 销毁readView的时候 减去引用次数更合理吧. 仅仅修改状态 可能无法处理 多个事务 同时引用同一个undo段的情况
2022-04-11
共5条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程