MYSQL5.5版本之后默认的存储引擎是INNODB,其最主要的特点之一是支持非锁定读
面试中最常见的问题是mysql的事务隔离级别,感觉大家都快背诵了(下面摘入于《高性能MYSQL第三版》):
好了,背诵完了之后,简单的介绍一下原理:
首先介绍一下多版本并发控制(MVCC,Multi Version Concurrency Control)
因为innodb存储引擎一个特性是非锁定读,即意味着当某行数据正在做更新操作的时候,这时会产生行级锁,此时该读取线程并不会等待该锁的释放,而是先读取这一行的快照,并且该行不止一个快照,快照(Snapshot)是指该行之前版本的数据,多个快照是这行数据的多个版本,这种技术就叫做MVCC技术
(图片来自《MYSQL技术内幕 INNODB存储引擎》)
在事务级别是READ COMMITED的情况下,线程总是读取最新一份快照数据,因为在读取的过程中,其他的线程可能操作了该行数据,所以每次读取的数据可能不一致,即产生了所谓的脏读的情况,也可以叫做不可重复读,因为每次读取的内容不一定一样
在事务级别是READ REPEATABLE情况下,线程总是读取事务开始时的行版本的数据,所以读取的内容总是一致的