MySQL多版本并发控制(MVCC)
MVCC是行级锁的一个变种,但是它在很多的情况下避免了加锁操作,因此开销更低。MySQL,包括Oracle、PostgreSQL都实现了MVCC,虽然每个关系数据库实现不一样,但大都是实现了非阻塞的读操作,写操作也只锁定必要的行。
MVCC的实现原理:InnoDB的MVCC的实现原理,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间或删除时间。MVCC实现类型都是有乐观并发控制和悲观并发控制。
MVCC下的SELECT、INSERT、DELETE、UPDATE是如何进行操作的:
SELECT:需要满足两个条件
1、只查询行版本号小于当前事务的版本号的行
2、查询删除版本大于当前事务的版本号的行、要么未定义的删除版本号的行
条件一确保了读取的行在读取之前就已经存在了而不是在读取更新之后的行
条件二确保了在查询之前未被删除
条件一和条件二满足了MySQL隔离级别中的可重复读
INSERT:
新插入的每一行保存当前系统版本号作为行版本号
DELETE:
每删除一行保存当前系统版本好作为删除版本号
UPDATE:
插入一行新记录,保存当前系统版本号作为行版本号, 同时保存当前系统版本号到原来那一行数据的行删除版本号。(可以看做执行了一次INSERT和一次DELETE操作)
MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。
其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁。