在 SQL 标准 和主流数据库(如 MySQL InnoDB、PostgreSQL)中:
✅ SERIALIZABLE(可串行化)隔离级别是可以避免幻读(Phantom Read)的。
幻读指的是:
在同一事务中,两次执行相同的范围查询,结果集的行数不同(因为有其他事务插入/删除了符合查询条件的新行)。
例如:
-- 事务 A
SELECT * FROM users WHERE age > 20;
-- 事务 B 插入一条 age = 25 的记录并提交
-- 事务 A 再次查询
SELECT * FROM users WHERE age > 20;
第二次查询看到了“新出现的行”,这就是幻读。
SQL 标准规定:
不同数据库实现方式不同,但目标一致:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ❌ | ❌ | ❌ |
| READ COMMITTED | ✅ | ❌ | ❌ |
| REPEATABLE READ | ✅ | ✅ | ❌* |
| SERIALIZABLE | ✅ | ✅ | ✅ |
*注:MySQL 的 REPEATABLE READ 通过 Next-Key Lock 也能避免幻读,但这是实现层面的增强,不是 SQL 标准保证。
SERIALIZABLE 隔离级别在理论和实现上都能避免幻读,是防止幻读最可靠的级别。
如果你愿意,我也可以帮你对比 REPEATABLE READ vs SERIALIZABLE 的性能差异,或者举例说明锁的行为。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。