今天跟大家说一下Mysql对MVCC的理解,可能很多人不太理解。为了让大家更好地理解,边肖为大家总结了以下内容。希望你能从这篇文章中有所收获。
Mvcc(多版本并发控制)是多版本并发控制。MVCC是一种并发控制方法,一般用于数据库管理系统,实现对数据库的并发访问。
在Mysql的InnoDB引擎中,是指READ COMMITTD和REPEATABLE READ两个隔离级别下的事务访问版本链中的记录进行SELECT操作的过程。
这允许其他事务修改该记录,并且无论如何每个修改都将被记录在版本链中。SELECT可以从版本链中获取记录,实现了读写、写读的并发执行,提高了系统的性能。
让我们具体看看这是如何实现的。
版本链
我们先来了解一下版本链的概念。在InnoDB引擎表中,在其聚集索引记录中有两个必要的隐藏列:
trx_id
每次修改聚集索引记录时,此id用于存储事务id。
roll_pointer
每次修改集群索引记录时,旧版本将被写入撤消日志。这个roll_pointer只是存储一个指针,指向这个聚集索引记录的前一个版本的位置,并通过它获取前一个版本的记录信息。(请注意,插入操作的撤消日志没有此属性,因为它没有旧版本。)
例如,有一个用事务id 60执行的该记录的修改语句。
此时,版本链存在于撤消日志中。
ReadView
谈完版本链,我们再来看看ReadView。已提交读和可重复读的区别就在于它们生成ReadView的策略不同.
ReadView主要有一个列表来存储我们系统中当前活动的读写事务,也就是开始未提交的事务。使用此列表来确定记录的版本是否对当前事务可见。假设当前列表中的交易id为[80,100]。
如果您要访问的记录版本的事务id为50,小于当前列表中的最小ID 80,则表示该事务是之前提交的,因此当前活动的事务可以访问该事务。
如果你要访问的记录版本的交易id为70,并且发现交易在列表id的最大值和最小值之间,那么再次判断它是否在列表中。如果是,则表示事务尚未提交,因此无法访问版本。如果不存在,则意味着事务已经提交,因此可以访问该版本。
如果你要访问的记录版本的事务id为110,大于id100的事务列表的最大ID,说明这个版本发生在ReadView生成之后,所以无法访问。
这些记录都在版本链中找到。首先,找到最新的记录。如果最新记录的事务id不符合条件且不可见,则查找之前的版本,将当前的事务id与该版本的事务id进行比较,看是否可以访问该版本,以此类推,直到返回或完成可见版本。
例如,在提交的读取隔离级别下:
比如此时有一笔交易,交易id为100,修改名称使名称等于小明2,但是交易还没有提交。此时的版本链是。
当时另一个事务发起了select语句查询id为1的记录,当时生成的ReadView列表只有[100]。然后去版本链找。首先,一定要找最近的。发现列表中有trx_id为100的记录,也就是小明2名字的记录,无法访问。
此时继续通过指针查找下一条名为小明1的记录,发现trx_id为60,小于列表中的最小id,因此可以访问,直接访问结果为小明1。
当时,我们把交易I。
d为100的事务提交了,并且新建了一个事务id为110也修改id为1的记录,并且不提交事务
这是时候版本链就是
这时候之前那个select事务又执行了一次查询,要查询id为1的记录。
这个时候关键的地方来了
如果你是已提交读隔离级别,这时候你会重新一个ReadView,那你的活动事务列表中的值就变了,变成了[110]。
按照上的说法,你去版本链通过trx_id对比查找到合适的结果就是小明2。
如果你是可重复读隔离级别,这时候你的ReadView还是第一次select时候生成的ReadView,也就是列表的值还是[100]。所以select的结果是小明1。所以第二次select结果和第一次一样,所以叫可重复读!
也就是说已提交读隔离级别下的事务在每次查询的开始都会生成一个独立的ReadView,而可重复读隔离级别则在第一次读的时候生成一个ReadView,之后的读都复用之前的ReadView。
看完上述内容,你们对对Mysql的MVCC的理解是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/46786.html