MySQL进阶之路(十二)——事务的4种隔离级别分别是什么
一、概述
在上一篇文章中给大家详细介绍了多个事务并发执行的场景下出现脏写、脏读、不可重复读和幻读的原因,本篇文章将会给大家详细介绍MySQL为了防止上述情况的发生分别是如何去做的
回顾之前所学的,事务具有ACID四种特性,其中 I
指的是事务的隔离性,对于隔离性,又有不同的隔离级别,不同的隔离级别本质上其实是在事务同时进行更改或查询操作时在结果的性能、可靠性、一致性和可再现性之间所作的取舍不同而已。
InnoDB支持的隔离级别有:SERIALIZABLE、 REPEATABLE READ、 READ COMMITTED和 READ UNCOMMITTED,对于的中文意思分别是:可串行化、可重复度、读已提交、读未提交。InnoDB默认的隔离级别是REPEATABLE READ。下面我们对这几个事务逐个进项分析
二、READ UNCOMMITTED(读未提交)
在这种隔离级别下,事务可以读到其他事物还没有提交的值,在这种情况下不会发生脏写,因为两个未提交的事务不可能会读取到同一行数据的值,其中一个事务读到的是另一个事物未提交的值。
在这种隔离级别之下,肯定会发生脏读,不可重复度以及幻读
这种隔离级别仅仅适用于只进行查询操作的场景,因此,该隔离级别可以说是基本上没多少地方会用到
三、READ COMMITTED(读已提交)
该隔离级别之下,事务只能读取到其他事物以及提交的数据,对于未提交的脏数据
是读取不到的,因此不会发生脏写和脏读、但是会发生不可重复度和幻读。
原因很简单,本事物执行多次的读操纵,读到的可能都是已经提交并且不相同的数据,因此会发生不可重复度,发生幻读的原因也很简单,你进行范围查询的时候,其他事物插入新的数据并且提交。
四、REPEATABLE READ(可重复读)
顾名思义,在一个事物提交之前对同一个数据进行多次的查询,每次查询到的值都是一样的,即便在此期间有其他事物对该数据进行了修改并且已经提交也不会影响。这也是InnoDB引擎默认的隔离级别。
在这种情况下不会发生脏读、脏写和不可重复读。可能会发生幻读,因为虽然可以重复的读取到相同的值,但是不能避免在进行范围查询时读取到不同数量的值。
五、SERIALIZABLE(可串行化)
这个隔离级别就比较简单粗暴了,在此隔离级别之下,所有事物只能串行的进行,不能并发的执行,在这隔离级别之下,脏写、脏读、不可重复读和幻读都不会发生,但是缺点很明显,性能极其的差!因此这种隔离级别在平时工作中几乎是用不到的
六、小结
上述的隔离界别其实都有他们的简称,比如RU、RC、RR,其中最重要的就是RC和RR了,而RU和SERIALIZABLE因为几乎用不到,所以不用太过于去关注。
之后的文章,将会给大家详细地去介绍,上述的几种隔离级别的实现原理。如果本篇文章有讲的不对的地方,欢迎指出。