数据库 - MySql MVVC机制

什么是MVVC

        MVCC:是一种多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是同时结合了MVCC机制,以处理更多的并发问题。当然Mysql中Innodb引擎才支持。

MySql如何实现的MVVC

        InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.     

insert语句后其实对应在数据中的表如下(后面两列是隐藏列,我们通过查询语句并看不到)

id name 创建时间(事务ID) 删除时间(事务ID)
1 a 1 undefined
2

b

1 undefined
3 c 1 undefined

SELECT

InnoDB会根据以下两个条件检查每行记录: 
a.InnoDB只会查找版本早于当前事务版本(时间)的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的. 
b.行的删除版本(时间)要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除. 
只有a,b同时满足的记录,才能返回作为查询结果.

DELETE

InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识. 即更改删除时间字段。

UPDATE

InnoDB执行UPDATE,实际上是新插入了一行记录,并保存其创建时间为当前事务的ID,同时保存当前事务ID到要UPDATE的行的删除时间.

总述:mysql通过为每一行记录保存两个隐藏的字段‘创建时间(事务ID)’,‘删除时间(事务ID)’,通过每个事务执行的操作,对应的对这两个字段进行更新,同时,在select时只能查询创建时间小于当前的且删除时间大于当前的记录,delete只能删除删除时间大于当前时间的。这里的时间都是指事务的版本号。

猜你喜欢

转载自blog.csdn.net/b9x__/article/details/81945337
今日推荐