1. 什么是幻读?
定义:
幻读是指在事务过程中,一个事务执行了某些查询操作后,另一事务插入、删除或更新了满足查询条件的新数据,当第一个事务再次执行相同的查询操作时,结果集出现了“幻觉”,即读取到(或缺少)先前查询中不存在的数据。
幻读与脏读、不可重复读的区别:
- 脏读:事务读取了另一个事务未提交的数据,可能会读到错误结果。
- 不可重复读:事务在两次读取中,读到的数据被其他事务修改了,数据值不同。
- 幻读:事务在两次读取中,结果集的记录条数或范围变化了,比如多了新记录或少了某些记录。
举例说明:
假设有一个数据库表 employees
,内容如下:
id | name | salary |
---|---|---|
1 | Alice | 5000 |
2 | Bob | 4000 |
3 | Charlie | 3000 |
场景:
事务A执行如下查询:
SELECT * FROM employees WHERE salary > 3000;
结果为:
id | name | salary |
---|---|---|
1 | Alice | 5000 |
2 | Bob | 4000 |
这时,事务B插入了一条新记录:
INSERT INTO employees (id, name, salary) VALUES (4, 'David', 4500);
如果事务A再次执行相同的查询操作,结果会变为:
id | name | salary |
---|