二、四种标准隔离级别(由低到高)
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✅ 允许 | ✅ 允许 | ✅ 允许 | 最低隔离,性能最好,但问题最多 |
| READ COMMITTED | ❌ 禁止 | ✅ 允许 | ✅ 允许 | 每次读取都获取最新已提交的数据 |
| REPEATABLE READ | ❌ 禁止 | ❌ 禁止 | ⚠️ MySQL 特殊处理(通常禁止) | 默认级别,保证同一事务内多次读一致 |
| SERIALIZABLE | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | 最高隔离,完全串行化执行 |
1. RU:能读到别人未提交的事务
几乎没有隔离。
2. RC:只读别人已经提交的
解决了脏读问题。RC每次SELECT都会重新生成一个快照,所以两次查询能查询到不同的数据。
3. RR
RR每次SELECT,在整个事务期间共享同一个快照。因此整个事务期间看到的数据都是一样的。
解决了脏读、不可重复读,但幻读没有解决,MySQL有自己的解决方案。
RR不是整个事务期间共享一个快照吗?为什么会出现幻读?
RR 下普通 SELECT 使用同一快照,不会幻读;幻读发生在当前读(加锁读)中,因为它需要访问最新记录而不使用快照,于是可能看到其他事务新插入的行,所以 InnoDB 使用 Next-Key Lock 防止幻读。
4. 串行化
读写都加锁,所有事务都串行。效率最低