数据库在查询的时候容易出现的几个问题:
(1)脏读:一个事物读到另外一个事物未提交的数据。
(2)幻读:一个事物执行修改语句后发现查询得到的行数与事物开始的时候查询得到的行数多了。
(3)不可重复读:一个事物多次查询(中间没有其他操作)得到的结果不一致。
数据库的几种隔离级别:
读未提交:这个是数据库最低的隔离级别,也就是什么都不处理,那么两个事物A和B,A就可能读取到事物B还没有提交的内容,B修改了某个数据但是事物还没提交,可能后面会撤销修改的数据,但是数据库里面的数据已经修改了而且被其他事物读取。这样就会导致数据的脏读,不可重复读和幻读。于是就有了稍微高点的隔离级别。
读提交:读提交就是一个事物必须提交后,数据才会被写进数据库相应的表中,才能够被其他事物读取到。但是这并不能够避免不可重复读和幻读的情况。因为可能事物A在读取某个数据,这期间B事物对该数据进行了修改,然后A事物前后读取的数据就会出现差异。于是就有了更高级别的隔离级别:
可重复读:可重复读是MySQL的默认隔离级别,采用MVCC的机制来保证事物的可重复读,以下的参考链接主要就是讲的的MVCC机制。如果事物A仅仅是都在执行读操作的话,其他事物同时对相关的数据进行新增,修改或者删除操作,MVCC机制可以保证该事物A前后查询的结果是一致的,但是如果该事物中先进行查询操作,然后进行某个修改操作,然后在进行查询操作,那么就会出现幻读的情况,导致前后查询的结果行数不一致,这就会出现幻读。因此,这级别的隔离是可以保证数据库事物的可重复读属性,但是依然会出现幻读的情况,于是就有了最高级别的隔离:
串行化序列化:事物一个一个的顺序执行,这样就可以避免上面的所有问题,但是性能也会比较低。
参考链接:
https://www.jianshu.com/p/cef49aeff36b
https://blog.youkuaiyun.com/whoamiyang/article/details/51901888