脏读
读取未提交数据。脏读即事务A读取到事务B未提交的数据,如果此时事务B数据回滚,事务A仍然是使用旧的数据即是脏的数据。
顺序 | 事务A | 事务B |
---|---|---|
1 | 开始事务 | |
2 | 开始事务 | |
3 | 查询余额2000元 | |
4 | 取出1000元剩余1000元 | |
5 | 查询余额剩余1000元(脏读) | |
6 | 产生异常事务发生回滚,余额剩余2000元 | |
7 | 转入2000元,余额为3000元 | |
8 | 提交事务 | |
- | 数据发生异常(凭空少了1000元) |
不可重复读
前后多次读取,数据内容不一致。事务A多次读取某个数据而这些数据不能保证每次查询都一致。在A的事务期间事务B改变了这个值将导致事务A第二次读取和第一次查询到的值不一致。
顺序 | 事务A | 事务B |
---|---|---|
1 | 开始事务 | |
2 | 第一次查询年龄为20 | |
3 | 开始事务 | |
4 | 其他操作 | |
5 | 更改年龄为30 | |
6 | 提交事务 | |
7 | 第二次查询年龄为30 | |
- | 一个事务中同一条件下第一次查询与第二次查询结果不一致 |
幻读
前后多次读取,数据总量不一致。事务A需要多次根据某固定条件查询统计数据的总量,而这些总量值并不能保证每次查询都一致。在A的事务期间事务B新增数据或删除数据将导致事务A第二次读取和第一次查询到的值不一致。
顺序 | 事务A | 事务B |
---|---|---|
1 | 开始事务 | |
2 | 第一次查询,数据总量为10条 | |
3 | 开始事务 | |
4 | 其他操作 | |
5 | 插入数据2条 | |
6 | 提交事务 | |
7 | 第二次查询数据总量为12条 | |
- | 一个事务中同一条件下查询出的条数不一致 |