脏读、幻读、不可重复读的定义和区别


脏读:事务A正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务B也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么事务B读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。【事务B读取到了事务A没有提交的数据】

不可重复读:事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。在事务A第一次读取数据后,事务B执行了更改操作,事务A第二次读取到该值时发现和之前的数据不一样,系统不可以读取到重复的数据,称为不可重复读。【同一个事务中重复读取时获得的数据不同】

幻读:事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,而后事务A第二次读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,称为幻读。【前后多次读取,数据总量不一致】

不可重复读的重点在修改,在同一事务中,同样的条件,第一次读取的数据和第二次读取的数据不一样(因为中间有其他事务提交了修改) 幻读的重点在删除和插入,在同一事务中,同样的条件,第一次读取的记录数第二次读取的记录数不一致。【因为中间有其他事务提交了插入和删除操作】
不可重复读关键在于特定的某个数据发生了变化,而幻读关键在于整体的数据量发生了变化。

数据库中四大隔离级别:read_uncommitted读未提交,read_committed读已提交,repeatable_read重复读,serializable序列化(即串行访问)
其中:
read_uncommitted级别最低,不能解决脏读、不可重复读、幻读。
read_committed可以解决脏读,不能解决不可重复读、幻读。
repeatable_read可以解决脏读、不可重复读,但不能避免幻读。
serializable隔离级别最高,可以避免脏读、不可重复读、幻读,但是效率低下。

SQL Server和Oracle默认隔离级别为read_committed,而Mysql默认隔离级别为repeatable_read。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM