事务的4种隔离级别

在说隔离级别之前,我们首先需要了解一些为什么会有隔离级别!在对数据库的操作之中,我们的程序一般会有好几个线程同时进行操作,这就导致了数据的读写问题,有可能会造成数据的脏读、幻读、不可重复读。

什么是脏读?----一个事务读取了另外一个事务未提交的修改数据。
举例:当开启了两个事务,一个事务更新了数据,但未提交事务,数据的修改并未真正持久化到数据库里面。这时候,另外一个线程对该数据进行了读取,而又是在这时候,前一个线程回归了修改的数据。那么另外的线程已读取的数据便是脏数据,这种情况称为脏读。

什么是不可重复读?----一个事务多次读取同一个数据,在事务未提交前,其他事务修改了该数据而导致前后读取数据不一致的情况。
举例:当开启了两个事务,一个事务多次读取同一条数据,这需要在事务范围里面数据是不变的。但是在事务未结束之前,由于另外的事务介入,修改了该条数据,导致前一个事务多次读取数据的前后值不一致,这种情况称为不可重复读。

什么是幻读?----一个事务多次查询期间,由于其他事务的插入或删除操作导致查询的结果集不同的情况。
举例:当开启了两个事务,一个事务多次读取某个数据,事务未提交,而这时候,另外一个线程对该数据进行插入、删除,导致前一个事务查询出现“没有数据->有数据->没有数据”的情况,这就称为幻读。

为了应对数据的读写问题,事务可以被设置为4个级别,读未提交、读已提交、可重复读、串行化。
在读未提交的隔离级别下,事务会出现脏读、不可重复读、幻读。
在读已提交的隔离级别下,事务会出现不可重复读、幻读。
在可重复读的隔离级别下,事务会出现幻读。
在串行化的隔离级别下,事务将不会出现上述情况,但是由于串行化的执行,导致执行效率下降,性能降低,并不是最好的选择。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。