MySQL 多版本并发控制(MVCC)

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁的操作,因此开销会很低。主要实现的是非阻塞的读操作,写操作也只是锁定必要的行。MVCC的实现是通过保存数据在某个时间点的快照来实现的,也就是说,不管需要执行多长时间,每一个事务看到的数据都是一致的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

InnoDB的MVCC是通过在每行记录后边保存两实际个隐藏的列来实现的(一个保存了创建时间,另一个保存了过期时间)。当然,保存的不是实际的时间,而是系统的版本号(System Version Number)。每个开始的新任务,系统版本号都会递增,事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较,MVCC的具体操作:

  • SELECT InnoDB会根据两个条件来检查每行记录: 1.InnoDB只查找版本早于当前事务版本的数据行。2. 行的删除版本要么未定义,要么大于当前事物版本号。
  • INSERT InnoDB会为新插入的每一行保存当前系统版本号。
  • DELETE InnoDB会为删除的每一行保存当前系统版本号作为行删除的标识。
  • UPDATE InnoDB会为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

MVCC只在REPEATABLE READ 和READ COMMITED两个隔离级别下工作。其余两个都不兼容(一个是只读取最新行,一个是加锁)

posted @ 2017-03-17 09:29  Ant°  阅读(301)  评论(0编辑  收藏  举报