MYSQL MVCC实现及其机制(转)

多版本并发控制数据库

Multiversion Concurrency Control并发

大部分的MySQL的存储 引擎,好比InnoDB,Falcon,以及PBXT并非简简单单的使用行锁机制。它们都使用了行锁结合一种提升并发的技术,被称为MVCC(多版本并发控制)。MVCC并不仅仅应用在MySQL中,其余的数据库如Oracle,PostgreSQL,以及其余数据库也使用这个技术。高并发

MVCC避免了许多须要加锁的情形以及下降消耗。这取决于它实现的方式,它容许非阻塞读取,在写的操做的时候阻塞必要的记录。spa

MVCC保存了某一时刻数据的一个快照。意思就是不管事物运行了多久,它们都能看到一致的数据。也就是说在相同的时间下,不一样的事物看相同表的数据是不一样的。若是你历来没有这方面的经验,可能说这些有点使人困惑。可是在之后这个会很容易理解和熟悉的。事件

每一个存储引擎实现MVCC方式都是不一样的。有许多种包含了乐观(optimistic)和悲观(pessimistic)的并发控制。咱们用简单的InnoDb的行为来举例说明MVCC工做方式。io

InnoDB实现MVCC的方法是,它存储了每一行的两个额外的隐藏字段,这两个隐藏字段分别记录了行的建立的时间和删除的时间。在每一个事件发生的时 候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增长。自记录时间开始,每一个事物都会保存记录的系统版本号。依照事物的 版原本检查每行的版本号。在事物隔离级别为可重复读的状况下,来看看怎样应用它。table

SELECT序列化

InnoDB检查每行,要肯定它符合两个标准。方法

InnoDB必须知道行的版本号,这个行的版本号至少要和事物版本号同样的老。(也就是是说它的版本号可能少于或者和事物版本号相同)。这个既能肯定事物开始以前行是存在的,也能肯定事物建立或修改了这行。im

行的删除操做的版本必定是未定义的或者大于事物的版本号。肯定了事物开始以前,行没有被删除。

符合了以上两点。会返回查询结果。

INSERT

InnoDB记录了当前新增行的系统版本号。

DELETE

InnoDB记录的删除行的系统版本号做为行的删除ID。

UPDATE

InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号做为了删除行的版本。

全部其余记录的结果保存是,从未得到锁的查询。这样它们查询的数据就会尽量的快。要肯定查询行要遵循这些标准。缺点是存储引擎要为每一行存储更多的数据,检查行的时候要作更多的处理以及其余内部的一些操做。

MVCC只能在可重复读和可提交读的隔离级别下生效。不可提交读不能使用它的缘由是不能读取符合事物版本的行版本。它们老是读取最新的行版本。可序列化不能使用MVCC的缘由是,它老是要锁定行。

下面的表说明了在MySQL中不一样锁的模式以及并发级别。

锁的策略 并发性 开销 引擎
最低 最低 MyISAM,Merge,Memory
NDB Cluster
行和MVCC 最高 最高 InnoDB,Falcon,PBXT,solidD
相关文章
相关标签/搜索