当前位置:Gxlcms > 数据库问题 > 数据库的脏读、不可重复读和幻读区别

数据库的脏读、不可重复读和幻读区别

时间:2021-07-01 10:21:17 帮助过:33人阅读

脏读(Read Uncommitted)
通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。
你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。
举例:

技术图片

3.2 不可重复读(Non-repeatable Read)
通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。
与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。
举例:

技术图片

3.3 幻读
在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。
事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。
举例:
技术图片

  举例2:

  1. 脏读的情况:对于两个事务T1与T2,T1读取了已经被T2更新但是还没有提交的字段之后,若此时T2回滚,T1读取的内容就是临时并且无效的

  开启两个mysql客户端,并创建一张测试表transaction

  技术图片

  更改默认隔离级别REPEATABLE READ为READ UNCOMMITTED,用于测试

SELECT @@tx_isolation; #查询隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; # 更改隔离级别

  技术图片

   两个客户端同时开启事务,其中一个事务做UPDATE操作,另一个事务做SELECT

  技术图片

  若此时黑色背景的客户端进行回滚,则白色背景的客户端读取的数据就是临时并且无效的。即脏读。

  2. 不可重复读: 对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段并提交之后,T1再次提取同一个字段,值便不相等了。

  技术图片

  重复读取的结果不一致的情况发生。

  3. 幻读: 对于两个事务T1、T2,T1从表中读取数据,然后T2进行了INSERT操作并提交,当T1‘再次读取的时候,结果不一致的情况发生。

  技术图片

 

数据库的脏读、不可重复读和幻读区别

标签:存储引擎   innodb   对比   其他   png   怎么办   事务隔离级别   相等   原则   

人气教程排行