数据库会被广大用户共享访问,那么在数据库并发操作过程中可能会出现一些不确定的情况。
- 脏读(Dirty Read)
- 不可重复读(Non-repeatable Read)
- 幻读(Phantom Read)
这三个现象的严重性排序如下:
脏读
读取未提交数据。
事务 A 读取事务 B 尚未提交的数据,此时如果事务 B 发生错误并回滚,那么事务 A 读取到的数据就是脏数据。
不可重复读
前后多次读取,数据内容不一致。
事务 A 在事务 B 开始前读和事务 B 结束后读的数据不一样,因为数据被事务 B 修改了。
幻读
当同一个查询在不同时间产生不同的结果集时,称之为幻读。
比如事务 A 在读取某个范围内的记录时,事务 B 在该范围内插入了新记录或删除了旧记录,事务 A 再次读取该范围内的记录时,前后获取的结果集不同,产生了幻读。
幻读比不可重复读取更难防范,因为锁定第一个查询结果集中的所有行并不能阻止导致幻像出现的更改。