1 、read_view 中维护了系统中活跃事务集合的快照,这些活跃事务 ID 的最小值为 up_limit_id,最大值为 low_limit_id ; SELECT 操作返回结果的可见性是由以下规则决定的:
DB_TRX_ID < up_limit_id -> 此记录的最后一次修改在 read_view 创建之前,可见
DB_TRX_ID > low_limit_id -> 此记录的最后一次修改在 read_view 创建之后,不可见 -> 需要用 DB_ROLL_PTR 查找 undo log(此记录的上一次修改),然后根据 undo log 的 DB_TRX_ID 再计算一次可见性
up_limit_id <= DB_TRX_ID <= low_limit_id -> 需要进一步检查 read_view 中是否含有 DB_TRX_ID
DB_TRX_ID ∉ read_view -> 此记录的最后一次修改在 read_view 创建之前,可见
DB_TRX_ID ∈ read_view -> 此记录的最后一次修改在 read_view 创建时尚未保存,不可见 -> 需要用 DB_ROLL_PTR 查找 undo log(此记录的上一次修改),然后根据 undo log 的 DB_TRX_ID 再从头计算一次可见性
2 、RR 隔离级别下:read view 是在 first touch read 时创建的,也就是执行事务中的第一条 SELECT 语句的瞬间,后续所有的 SELECT 都是复用这个 read view,所以能保证每次读取的一致性(可重复读的语义)
按照这个说法,RR 隔离级别下是读取不到其他事务插入的数据的,那为什么还需要 next-key lock 算法加锁来阻止其他事务的插入呢
求大佬解惑
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.