🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云星级博主
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
🔥 联系方式vx:zsqtcc
🤞面试官偷偷告诉我:如何优化提升接口的性能🤞
正菜来了⛳⛳⛳
心里一万个我说你个der,面个试,非得让我造火箭,迫于无奈还是说吧。
MVCC:多版本控制协议
因为我们基于事务对数据库操作的时候不同的事务操作,会影响数据的变化,所以有一个undolog文件用于记录每个事务修改的数据信息记录,每个记录后边会加上对应的修改这个信息的事务id即trxid和指向上一个数据版本的point。
多版本控制协议是针对事务的隔离级别RC(读已提交)和RR(可重复读)来进行操作的。
对于快照读来说,每哥事务读取数据的时候会生成一个快照,快照中含有当前事务id和活动事务列表(就是没有提交的事务),以及最小活动事务id和最大活动事务id+1。
当一个事务select进行查询的时候,会生成一个快照,然后根据快照中的信息对ubdolog版本链中数据进行遍历,知道找到满足快照中条件的数据。
条件:版本链中当前行的事务id==快照中事务id或者小于快照中最小活动的id返回当前版本链中当前行的数据,若是当前行中的事务id大于等于快照中最大的活动事务id直接遍历下一行数据,当前行记录的事务id如果大于最小活动事务id小于最大活动事务id,就去活动id的数组中查询是不是在数组中,如果不在的话就直接返回当前行的数据,如果在的话遍历下一行以此类推。
RC隔离级别下:一个事务每一次快照读都会产生一个新的快照,所以不可重复读。
RR隔离级别下:一个事务的多次快照都都是使用的第一次度的时候的快照,所以可以借解决重复读,因为连续多次快照读都会重用一个快照,所以其他的事务并不会影响到RR的事务,所以就解决了幻读的问题。
值得主义的一个问题是如果两个快照都之间插入了一个当前读,就是这种 select for update,快照读就会生成两个不同的快照。