【数据库】MVCC(多版本并发控制)

【数据库】MVCC(多版本并发控制),第1张

【数据库】MVCC(多版本并发控制)
目录

概念

        多版本并发控制

        优点

        适用范围

实现原理

        举个例子

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事务2事务3事务4update table set name = 'A' where id  = 1update table set name = 'B' where id  = 1commitupdate table set name = 'C' where id  = 1update table set name = 'D' where id  = 1select name from table where id  = 1 ; read-view:[1,3] 3commitcommitselect name from table where id  = 1 

        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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5719843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存