文章摘要(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判断条件:
- 首先比较 trx_id < min_trx_id, 如果小于,则当前事务能看到trx_id 所在的记录,如果大于等于进入下一个判断
- 接下来判断 trx_id 大于等于 max_trx_id , 如果大于等于则代表trx_id 所在的记录在Read View生成后才出现的,那对当前事务肯定不可见,如果小于则进入下一个判断
- 判断trx_id 是否在活跃事务之中,m_ids.contains(trx_id),如果在,则代表我Read View生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的;如果不在,则说明,你这个事务在Read View生成之前就已经Commit了,你修改的结果,我当前事务是能看见的
由于MVCC的版本特性,我们知道事务A的readView对于自己本身不可见,即teacher_id 30对应的值始终指向“初三二班”,所以事务A再次进行无锁的select查询时,属于快照读,读取的值仍为“初三二班”;
评论区