赃读、不可重复读 和 幻读

三种读法的产生原因:都是由于并发访问导致数据发生了变化

1.脏读(读取未提交的数据)

  事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中;此时事务B也访问这个数据,并且使用了这个数据。

2.不可重复读(前后多次读取,发现数据内容不一致)

  事务A在执行读取操作,由于事务A比较大,前后读取完同一条数据可能需要经历很长的时间。当事务A读取完一条数据;随后事件B执行了更改操作,将之前的数据进行了修改;当事务A第二次读取这串数据,发现此次读取的数据内容跟之前不同了,也就是数据不重复了。

  事务A 事务B
1 开始事务  
2 第一次读取数据,小明年龄为20  
3   开始事务
4 其他操作  
5   更改小明年龄为30
6   提交事务
7 第二次读取数据,此时小明年龄已为30  
备注 按照正常逻辑,事务A前后两次取到的数据应该一致

 

3.幻读(前后多次读取,发现数据总量不一致)

  事务A在执行读取操作,需要进行两次统计数据的总量,前一次查询完数据总量后;此时事务B执行了新增数据总量的操作,并且提交;事件A进行第二次读取数据的总量,发现跟第一次统计的数量不同,就像产生了幻觉一样,平白无故的多了几条数据。

  事务A 事务B
1 开始事务  
2 第一次查询,假设数据总量为100条  
3   开始事务
4 其他操作  
5   新增加100条数据
6   提交事务
7 第二次查询,发现数据总量已为200条  
备注 按照正常逻辑,事务A前后两次取到的数据应该一致

注意:

  不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了。

  幻读的重点在于新增或者删除:同样的条件,第 1 次和第 2 次读出来的记录数不一样。

posted @ 2019-11-07 19:42  kuanglinfeng  阅读(303)  评论(0编辑  收藏  举报