首先声明~
可重复读是隔离级别,
幻读是这个隔离级别下出现的问题。
含义
可重复读
是指 在修改删除的前提下,同一个事务中,执行的查询结果是一致的
举个栗子:
时间线 | 事务1 | 事务2 |
---|---|---|
1 | 开启事务 | |
2 | 查询数据A | |
3 | 开启事务 | |
4 | 更新数据A | |
5 | 提交事务 | |
6 | 查询数据A |
对于事务1,两次查询的结果应该是一致,无论事务2是更新了数据A还是删除了数据A
幻读
个人理解,在新增的前提下,同一个事务查询和插入的预期结果不一致,查询没有,但是插入会报错
时间线 | 事务1 | 事务2 |
---|---|---|
1 | 开启事务 | |
2 | 开启事务 | |
3 | 插入数据A | |
4 | 提交事务 | |
5 | 查询A,不存在 | |
6 | 插入A,报错 |
原理
mysql进行读操作时分两种情况:
1、一致性读(快照读)
2、当前读
一致性读
基于MVCC,当前事务内,只能读到事务id小于当前事务且非正在进行中的事务的数据
select时使用快照读
当前读
读取的是最新的数据,insert/update/delete时使用当前读