Mysql MVCC机制我的一些理解
什么是MVCC?
MVCC 全称是 Multi-Version Concurrency Control, 即多版本并发控制。MVCC 在Mysql的 InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读.
其实我在之前读了很多篇关于MVCC的文章,大多讲的比较模糊,最近在看《Mysql是怎样运行的-从根儿上理解Mysql》这本书讲的非常好。让我理解了MVCC。其实就最简单来讲,用READ COMMIT和 REPERATED COMMIT这两个隔离机制讲解就非常清楚了。
首先是 读已提交这种隔离级别,这种不能防止脏读,为什么呢?因为它的READ VIEW在每次SELECT的时候会生成一次。比如我一个事务中,第一次查询该记录的时候,生成了一次READ VIEW ,然后这笔记录被另一个事务修改并且提交了,那么当前事务再进行查询的时候,结果会是另一个事务提交后的结果,所以就产生了脏读,同一个事务读取了不同的结果。
如果是可重复度这种隔离级别呢?这种是可以防止脏读的出现的。顾名思义,可重复读,在同一个事务里,是可以重复读取同一笔记录的并且结果不会变。咋实现的呢?原因就在这个READ VIEW,在该笔事务开始查询之前,也就是SELECT之前,就会生成一个READ VIEW,并且在这笔事务结束之前不会变,一直是这个READ VIEW,所以,不论其他事务对这个记录做任何改动并且提交,它读到的一直会是这笔记录在该事务开始的时候的记录。因此不会产生脏读。
但是读已提交是没办法阻止幻读的出现的。因为幻读的话,是查询一系列数据,是一个结果集,并不是一个结果,所以其他事务可能会对这个结果集进行插入操作,导致该事务查询的前后结果集数量不一样,就像产生了幻觉一样。那么如何解决幻读呢?其实就是后面所讲的,加NEXT-KEY LOCK和 RECORD LOCK,就是把这个范围内记录的最大值加上间隙锁和记录锁,这样对这个记录内所有记录的修改和插入都无法进行,因为其他事务无法获取到这个区间内记录的锁,所以无法进行修改