MVCC(多版本并发控制)
可以认为是行级锁的一个变种,同时避免的很多枷锁操作,实现非阻塞的读操作,对于写操作来说只锁定必要的行。
-
实现原理
通过保存数据在某个时间点的快照来实现,因此不管需要执行多长时间,每个事务看到的数据都是一致的。即由于事务开始的时间不同,每个事务对同一张表,对同一时刻的数据可能是不一样的。
对于InnoDB来说,其MVCC通过在每行记录后面保存两个隐藏的列来实现,一个列保存行的创建时间(系统版本号),一个列保存行的过期时间(系统版本号),每次新建事务,其版本号都会递增,事务开始时刻的版本号作为事务的版本号,同查询到每行记录的版本号进行比较。 -
具体实现
在可重复读的隔离级别下有: **select** 1.只查找版本早于(或等于)当前事务版本的数据行,可以确保所查数据为当前版本之前,或当前版本插入或修改的。 2.行的删除版本要么未定义,要么大于当前事务版本号,确保事务读取到的行,在事务开始之前未被删除。 符合的便为查询结果 **insert** 为新插入的每一行保存当前版本号为行版本号 **delete** 为删除的每一行保存当前的版本号为行删除版本号 **update** 为插入一行新纪录,保存当前系统版本号为行版本号,同时保存当前系统版本号到原来的行作为行删除版本号 **只适用于可重复读和读已提交的隔离级别,对于读未提交,因为总是读取最新数据行,而不是符合当前事务版本的数据行,序列化读会对所有读取的行进行加锁**