脏读 | 不可重读 | 幻读 | |
---|---|---|---|
读未提交 | 发生 | 发生 | 发生 |
读已提交 | 不发生 | 发生 | 发生 |
可重复读 | 不发生 | 不发生 | 发生 |
串行化 | 不发生 | 不发生 | 不发生 |
脏读
脏读指的事读到了其他未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据中,也就是不存在的数据。
实例
事务B | 事务A | 结果 |
---|---|---|
select t.num form t where t.id=1 | 1 | |
begin | ||
update t set t.num=2 where t.id =1 | ||
select t.num from where t.id=1 | 2 | |
rollback | ||
select t.num from t where t.id =1 | 1 |
不可重读
不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
实例
** 事务A** | 事务B | 结果 |
---|---|---|
select t.num from t where t.id =1 | 1 | |
update t set t.num=2 where it=1 | ||
select t.num from t where t.id =1 | 2 |
幻读
幻读,并不是说两次读取的获取的结果不同,幻读侧重的方面是某一次的select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。 更为具体一些: select 某记录是否存在,不存在,准备插入此记录,但执行insert 时发现此记录已存在,无法插入,此时就发生了幻读
实例
在可重复读下研究的
- 事务A ,查询是否存在id=5的记录,没有测插入,正常逻辑做法
- 此时 事务B 新增一条id=5的记录,并提交事务
- 事务A 再次去查询 id=5的时候,发现还是没有记录
- 事务A 插入一条 id=5的数据
最终事务A提交,发现报错了。查询的时候没有这条记录,但插入的时候就有,主键冲突,如同幻觉。