三种读法的产生原因:都是由于并发访问导致数据发生了变化
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 次读出来的记录数不一样。