三种读法的产生缘由:都是因为并发访问致使数据发生了变化数据库
事务A正在访问数据,而且对数据进行了修改,而这种修改尚未提交到数据库中;此时事务B也访问这个数据,而且使用了这个数据。并发
事务A在执行读取操做,因为事务A比较大,先后读取完同一条数据可能须要经历很长的时间。当事务A读取完一条数据;随后事件B执行了更改操做,将以前的数据进行了修改;当事务A第二次读取这串数据,发现这次读取的数据内容跟以前不一样了,也就是数据不重复了。spa
事务A | 事务B | |
1 | 开始事务 | |
2 | 第一次读取数据,小明年龄为20 | |
3 | 开始事务 | |
4 | 其余操做 | |
5 | 更改小明年龄为30 | |
6 | 提交事务 | |
7 | 第二次读取数据,此时小明年龄已为30 | |
备注 | 按照正常逻辑,事务A先后两次取到的数据应该一致 |
事务A在执行读取操做,须要进行两次统计数据的总量,前一次查询完数据总量后;此时事务B执行了新增数据总量的操做,而且提交;事件A进行第二次读取数据的总量,发现跟第一次统计的数量不一样,就像产生了幻觉同样,无缘无故的多了几条数据。事件
事务A | 事务B | |
1 | 开始事务 | |
2 | 第一次查询,假设数据总量为100条 | |
3 | 开始事务 | |
4 | 其余操做 | |
5 | 新增长100条数据 | |
6 | 提交事务 | |
7 | 第二次查询,发现数据总量已为200条 | |
备注 | 按照正常逻辑,事务A先后两次取到的数据应该一致 |
注意:事务
不可重复读的重点是修改:一样的条件,你读取过的数据,再次读取出来发现值不同了。table
幻读的重点在于新增或者删除:一样的条件,第 1 次和第 2 次读出来的记录数不同。统计