1.概述:
定义:Multiversion concurrency control, is a concurrency control method commonly used by database management systems to provide concurrent access to the database and in programming languages to implement transactional memory.
MVCC,即多版本并发控制技术,可以使支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,提高数据库系统的并发性能.
MVCC是一种乐观锁的实现
MVCC已广泛应用于Oracle、MySQL InnoDB、MS SQL Server 2005+、Postgresql、Firebird、Maria
2.原理:
原来,为了实现mvcc,innodb对每一行都加上了两个隐含的列,其中一列存储行被更新的”时间”,另外一列存储行被删除的”时间”
这里,innodb存储的并不是绝对的时间,而是与时间对应的数据库系统的版本号,每当一个事务开始的时候,innodb都会给这个事务分配一个递增的版本号,所以版本号也可以被认为是事务号。对于每一个”查询”语句,innodb都会把这个查询语句的版本号同这个查询语句遇到的行的版本号进行对比,然后结合不同的事务隔离等级,来决定是否返回该行
3.细节:
1) SELECT--对于select语句,只有同时满足了下面两个条件的行,才能被返回:
•行的被修改版本号小于或者等于该事务号
•行的被删除版本号要么没有被定义,要么大于事务的版本号:行的删除版本号如果没有被定义,说明该行没有被删除过;如果删除版本号大于当前事务的事务号,说明该行是被该事务后面启动的事务删除的,由于是repeatable read隔离等级,后开始的事务对数据的影响不应该被先开始的事务看见,所以该行应该被返回
2) INSERT--对新插入的行,行的更新版本被修改为该事务的事务号
3) DELETE--对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除
4) UPDATE--在更新行的时候,innodb会把原来的行复制一份到回滚段中,并把当前的事务号作为该行的更新版本
4.优缺点
优点:不用获得锁,通过版本实现
缺点:需要维护版本信息;检索时需要版本比较
5.INNODB支持的事务隔离等级:MVCC由于其实现原理,只支持read committed和repeatable read隔离等级
INNODB支持并实现了ISO标准的4个事务隔离等级,即 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
参考:
http://donghui.blog.51cto.com/2709336/692586
原文:http://www.cnblogs.com/ppp21spider/p/5230433.html