做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)

MYSQL5.5版本之后默认的存储引擎是INNODB,其最主要的特点之一是支持非锁定读

  面试中最常见的问题是mysql的事务隔离级别,感觉大家都快背诵了(下面摘入于《高性能MYSQL第三版》):

 做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)_第1张图片

做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)_第2张图片

做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)_第3张图片

做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)_第4张图片

好了,背诵完了之后,简单的介绍一下原理:

首先介绍一下多版本并发控制(MVCC,Multi Version Concurrency Control)

  因为innodb存储引擎一个特性是非锁定读,即意味着当某行数据正在做更新操作的时候,这时会产生行级锁,此时该读取线程并不会等待该锁的释放,而是先读取这一行的快照,并且该行不止一个快照,快照(Snapshot)是指该行之前版本的数据,多个快照是这行数据的多个版本,这种技术就叫做MVCC技术

                                                                         做一个合格的程序猿之MYSQL存储引擎INNODB简介之非锁定读(二)_第5张图片

                                                                                               (图片来自《MYSQL技术内幕 INNODB存储引擎》)

 在事务级别是READ COMMITED的情况下,线程总是读取最新一份快照数据,因为在读取的过程中,其他的线程可能操作了该行数据,所以每次读取的数据可能不一致,即产生了所谓的脏读的情况,也可以叫做不可重复读,因为每次读取的内容不一定一样

 在事务级别是READ REPEATABLE情况下,线程总是读取事务开始时的行版本的数据,所以读取的内容总是一致的


   

  

 

你可能感兴趣的:(mysql)