MVCC机制略解

Posted 敲代码的小小酥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVCC机制略解相关的知识,希望对你有一定的参考价值。

mysql中,默认的隔离级别是可重复读。即在一个事物中读取到的数据总是一样的,即使其他事务把数据改了,那在这个事务中读取的数据还是第一次读取的数据。
mysql还可以设置为读已提交隔离级别。即一个事务中读取的数据,随着其他事务对数据的修改而改变。
能够保证隔离级别读取不同的数据的底层原理,就是MVCC机制。
MVCC机制,又叫多版本控制机制,下面大致看下该机制的工作原理。
undo日志版本链:
undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚 日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链。
对每条数据的修改,都会将该条数据记录在undo日志形成一条版本链,记录每个状态的修改值,如下图:

红色部分代表这条数据的修改历史,最后面的蓝色代表当前值。
一致性视图read-view
一致性视图是在一个事务中,当第一次执行查询语句时,会把返回的结果形成一个视图,放在内存中。这个视图就是针对这个事务的,其他的事务查询sql后,会生成其他对应的视图。在可重复读的隔离级别下,这个视图生成后,直到事务结束,都不会发生变化。这个视图里存的是第一次查询这条数据时已经提交事务的id和未提交事务的id。当在一个事务中再次查询这条语句的时候,read-view视图会根据存放的已提交事务id和未提交事务id在undo日志链中进行比较,来判断这个事务该读取undo日志链中的哪个数据,以此来保证可重复读。
由上面的描述可知,可MVCC机制是通过undo日志链和一致性视图来完成的。其本质就是一致性视图里存了事务当时查询的事务id,当这个事务再次查询时,从undo日志链中找当时视图中存的这个id,然后返回。

以上是关于MVCC机制略解的主要内容,如果未能解决你的问题,请参考以下文章

Mysql系列--MVCC机制

深入理解MVCC与BufferPool缓存机制

深入理解MVCC与BufferPool缓存机制

MySQL锁机制与MVCC原理--推荐阅读

Hbase 写入机制详解与MVCC机制

图解MVCC机制