1.什么是MVCC?
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 mvcc - @百度百科
2.MVCC有什么用?
在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能 同时还可以解决脏读,幻读,不可重复读等事务隔离问题。
3.MVCC的实现原理
(1)mysql在存储行数据时除了我们添加的业务数据,还会额外存储两个字段:transaction_id和roll_ptr,分别代表事务id和回滚指针,事务id对应的是生成这行数据的事务编号,回滚指针则指向这条数据的前一个版本,历史版本会形成一个链条,存储在undolog里面,类似如下结构;
(2)InnoDB在实现MVCC时使用一致性视图来实现不同的隔离级别,那什么是一致性视图呢?在当前事务中获得一致性视图的规则如下:
首先需要获取当前系统所有活跃的事务id,放在active_transaction_ids数组中,然后获取系统中的最大的事务id:max_transaction_id(注意是系统中所有的事务id中最大,不是active_transaction_ids数组中最大),如果在可重复读的隔离级别下,大于max_transaction_id的版本或者在active_transaction_ids数组中的版本都是不可见的,其它的数据对于当前事务都是可见的。按照事务提交时间来理解就是:在这个视图之前已经提交的事务版本是可以被当前事务看到的,在这之后提交的事务版本是不能够被看到的
读已提交和可重复读的区别就是一致性视图生成的时间不同,读已提交是在查询语句开始之前生成的,可重复读则是在事务开始的时候就生成了。