数据库 - 脏读不可重复读幻读。

Posted cjunn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库 - 脏读不可重复读幻读。相关的知识,希望对你有一定的参考价值。

脏读

  读取未提交数据。脏读即事务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条
- 一个事务中同一条件下查询出的条数不一致

数据隔离级别

  数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。mysql及oracle的默认事务隔离级别都是REPEATABLE-READ也就是可以重复读。

Read uncommitted

  可读取到未提交的数据。在该隔离级别下会发生数据脏读。

Read committed

  能够读取已提交的数据。在该隔离级别下虽然不会发生数据脏读但是会发生数据不可重复度。

Repeatable read

  能够重复读。在该隔离级别下能够实现数据重复读与避免脏读。对于处于读取状态的行,数据库会对该行进行加锁避免其他事物对该行进行修改。

Serializable

  事物串行化。对所有的事务进行串行化有序管理,前一个事务未结束后一个事务不可开始执行。在该事务级别下能避免脏读,不可重复读,幻读。

隔离级别总结

事务隔离级别 脏读 不可重复读 幻读
Read uncommitted(读未提交) 可能出现 可能出现 可能出现
Read committed(读已提交) 不会出现 可能出现 可能出现
Repeatable read(可重复读) 不会出现 不会出现 可能出现
Serializable(串行化) 不会出现 不会出现 不会出现

以上是关于数据库 - 脏读不可重复读幻读。的主要内容,如果未能解决你的问题,请参考以下文章

什么是脏读,幻读和不可重复读

脏读不可重复读幻读

数据库事务隔离级别-- 脏读幻读不可重复读(清晰解释)

脏读不可重复读幻读

数据库事务隔离级别-- 脏读幻读不可重复读

数据库事务隔离级别脏读重复读不可重复读幻读