欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

MVCC相关问答
(last modified Oct 26, 2022, 10:40 AM )
by
侧边栏壁纸
  • 累计撰写 176 篇文章
  • 累计创建 61 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

MVCC相关问答

橙序员
2022-10-09 / 0 评论 / 0 点赞 / 387 阅读 / 693 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

问题1:间隙锁,如果索引为string间隙锁的范围怎么确定?参考答案若字符串只包含数字,则按数字进行排序;若字符串含有字母,则按字母进行排序。相关验证参考:https://blog.csdn.net/mkmlmkmlmkml/article/details/125010620问题2:readView

问题1:间隙锁,如果索引为string间隙锁的范围怎么确定?

参考答案

若字符串只包含数字,则按数字进行排序;若字符串含有字母,则按字母进行排序。相关验证参考:https://blog.csdn.net/mkmlmkmlmkml/article/details/125010620

问题2:readView开启时间是什么时候?当前读会创建readView么?

参考答案

readView开启时机:

  • READ COMMITTED——在一个事务中,每次读取数据前都生成一个ReadView。
  • REPEATABLE READ——在一个事务中,只在第一次读取数据时生成一个ReadView。

根据创建时机可知,事务中的每次读操作都会创建readView,当前读和快照读只影响获取值,但当前读也会创建readView

参考:https://blog.csdn.net/QuietThinking/article/details/126130849

问题3:在以下示例中,事务B在事务A执行中对teacherId进行更新并提交事务,事务A会读取到什么值?

原有数据:

id class_name teacher_id
2 初三二班 30

事务查询:

事务A 事务B
begin; begin;
select id,class_name,teacher_id from class_teacher where teacher_id=30; (结果:id:2 class_name:初三二班 teacher_id:30)
update class_teacher set class_name=‘初三四班’ where teacher_id=30;
insert into class_teacher values (null,‘初三二班’,30);commit;
select id,class_name,teacher_id from class_teacher where teacher_id=30; (结果:id:2 class_name:??? teacher_id:30)
commit;

参考答案

readView判断条件:

  1. 首先比较 trx_id < min_trx_id, 如果小于,则当前事务能看到trx_id 所在的记录,如果大于等于进入下一个判断
  2. 接下来判断 trx_id 大于等于 max_trx_id , 如果大于等于则代表trx_id 所在的记录在Read View生成后才出现的,那对当前事务肯定不可见,如果小于则进入下一个判断
  3. 判断trx_id 是否在活跃事务之中,m_ids.contains(trx_id),如果在,则代表我Read View生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的;如果不在,则说明,你这个事务在Read View生成之前就已经Commit了,你修改的结果,我当前事务是能看见的

由于MVCC的版本特性,我们知道事务A的readView对于自己本身不可见,即teacher_id 30对应的值始终指向“初三二班”,所以事务A再次进行无锁的select查询时,属于快照读,读取的值仍为“初三二班”;

0

评论区