前言
大家应该都知道mysql的事务有四个隔离级别,但是他们分别是什么隔离级别并且会带来什么问题呢?接下来我为大家一一揭晓,通过图解的方式方便大家理解。
一、读未提交(Read Uncommitted)
1、这个是隔离级别最低的。
2、顾名思义,可以看出来就是一个事务可以读取另外一个未提交事务的修改。
3、存在的问题也最多,包含脏读、不可重复读、幻读。
4、因为存在问题最多,也是使用最少的隔离级别。
从图上可以看出来,事务1第一次查询的结果为18,当事务2修改过后事务在未提交的情况下,事务1再次查询的结果变为20。
这个就是脏读,事务1读取到了事务2修改了但是还未提交的数据。
二、读已提交(Read Committed)
1、大多数的数据库的默认隔离级别,但是mysql的默认隔离级别不是这个。
2、顾名思义,可以看出来一个事务只能读取到已经提交事务的修改。
3、存在的问题,包含不可重复读、幻读。
4、因为它只能读取到已经提交事务的修改,所以解决了脏读的情况。
从图上可以看出来,事务1第一次读取的结果为18,当事务2修改完数据但是未提交事务的情况,事务1第二次读取的结果还是18,接着事务2提交事务,然后事务1第三次读取的结果变为20。
这个就是不可重复读,事务1在前后两次查询的数据结果不一致,前面两次的结果为18,第三次的结果变为20。
三、可重复读(Repeatable Read)
1、这个是mysql的默认隔离级别,对于InnoDB来说。
2、在同一个事务内,多次读取的结果都是一致的。
3、存在的问题,幻读。
4、这个级别解决了不可重复读的情况。
从图上可以看出来,虽然事务2完成了数据修改并且已经提交事务,但是在事务1的视角看前后两次读取的数据结果还是一致的都是18,这就解决了不可重复读的情况。
但是存在另外一个幻读的问题,事务1第一次读取id<10的时候数据有一条,接着事务2新插入了一条id=2的数据,然后事务1再次读取id<10的时候数据就有两条了。
四、串行化(Serializable)
1、这个是隔离级别的最高级。
2、通过对事务进行排序,使之串行执行,所以解决了上面说的脏读、不可重复读、幻读的情况。
3、但是因为是串行执行,事务只能一个接着一个执行,大大降低了并发性能,所以也是最影响性能的。
总结
本文主要介绍了MySQL的四个事务隔离级(读未提交、读已提交、可重复读、串行化),以及不同隔离级别存在的一些问题(脏读、不可重复读、幻读),还有可以通过什么隔离级别解决上述问题。
最后因本人能力有限可能有些地方讲的不对或讲错了,希望大家指出来好让我改进,还望大家多多包含,谢谢大家。
标签:事务,读取,哪些,幻读,提交,MySQL,级别,隔离 From: https://blog.csdn.net/zhangbin1988/article/details/136742272