目录
概念
多版本并发控制
优点
适用范围
实现原理
举个例子
rr和rc在MVCC中的区别
学习之前,需要先了解事务的四种隔离级别
概念多版本并发控制
读取数据时通过一种类似快照的方式将数据保存下来,这样读写就不冲突了,MVCC使得普通的select请求不会加锁,提高了数据的并发处理能力,也是乐观锁的一种体现
优点读写不冲突,提高并发能力
适用范围只适用于rc(读已提交)和rr(可重复读)级别
实现原理
InnoDB的MVCC通过在每行记录后面保存连个隐藏的列来实现,分别为
事务ID(trx_id)
回滚指针(roll_pointer)
当执行查询SQL的时候,会生成一致性视图叫
read-view
事务ID是指,每开启一个心事五,都会自动递增产生一个新的事务id。事务开始时刻会把事务id放在当前事务影响的行事务id中,当查询时需要用当前事务id和每行记录的事务id进行比较
回滚指针是指,每次对那条记录有修改的时候,都会把老版本写入到undo日志中,这个回滚指针就是存放了一个指针,它指向这条记录上一个版本的位置,用过它来获得上一个版本的记录信息
read_view在开启查询事务中创建,维护当前活动的事务id,即未提交的事务id,排序生成一个(由小到大)数组(是数组不是区间!因为可能有些事务开启的晚但是提交的早,就会导致事务id大但是比事务id小的事务提前结束)
流程为,访问数据的undo log
如果当前undo log中的事务id比read_view中最大的数据小,而且不在read_view数组之中,说明事务已经提交,可以访问
如果当前undo log中的事务id比read_view中最大的数据大,或者在read_view数组之中,说明当前日志的事务还没有被提交,不能访问,应该顺着回滚指针查找上一个位置的日志
重复上述 *** 作直到找到符合条件的记录为止
举个例子1.当我们执行事务4查询事务的时候,会创建一个read_view因为事务二在事务4开始运行的时候已经提交了,所以数组中只有[1,3]两个元素
2.我们顺着undo日志,首先找到最新的 name='D'的记录,发现事务id(trx_id)为1,在read_view中,说明不能访问
3.顺着回滚指针找到name='C'的数据,发现事务id为3,同理不能访问
4.找到name='B'的数据,发现事务id=2,可以被访问,所以获取到了name='B'这条记录
rr和rc在MVCC中的区别
还是上面的例子
rr(可重复读)在事务4执行两次select语句时,都用同一个read_view,也就是这个事务第一次执行select语句中的数组[1,3]
rc(读已提交)在事务4执行两次select语句时,会创建两个read_view,第一次为[1,3],第二次为[1](这里是1还是没有存疑,总之表明的意思就是会根据select语句的时刻创建不同的read_view)
参考文章
膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili腾讯面试:MySQL事务与MVCC如何实现的隔离级别?_敖丙-CSDN博客【MySQL】究竟什么是MVCC呢? - boluo1230 - 博客园什么是MVCC?MVCC解决了什么问题?__RailGun_的博客-CSDN博客_mvcc解决了什么问题【MySQL】究竟什么是MVCC呢? - boluo1230 - 博客园腾讯面试:MySQL事务与MVCC如何实现的隔离级别?_敖丙-CSDN博客膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)