MySQL事务隔离级别共四种:READ UNCOMMITTED允许脏读;READ COMMITTED避免脏读但存在不可重复读;REPEATABLE READ为默认级别,通过MVCC和间隙锁解决脏读与不可重复读,基本缓解幻读;SERIALIZABLE强制串行执行,完全避免三类问题但性能最差。

MySQL 的事务隔离级别,是用来控制多个事务并发执行时,彼此之间能看到哪些数据、哪些修改的规则。它决定了一个事务在执行过程中,能否读到其他事务未提交或已提交但还未结束的数据,从而避免脏读、不可重复读、幻读等问题。
四种标准隔离级别
SQL 标准定义了四种隔离级别,MySQL 的 InnoDB 存储引擎全部支持:
- READ UNCOMMITTED(读未提交):最低级别。一个事务可以读到其他事务还没提交的修改(即“脏数据”)。极少使用,因为数据一致性无法保障。
- READ COMMITTED(读已提交):只能读到其他事务已经提交的数据。能避免脏读,但同一事务中多次查询可能得到不同结果(不可重复读)。
- REPEATABLE READ(可重复读):MySQL 默认级别。保证同一事务中多次读取同一数据的结果一致,解决了脏读和不可重复读。InnoDB 通过多版本并发控制(MVCC)+ 间隙锁(Gap Lock)进一步缓解幻读问题,但严格意义上仍可能出现幻读(如用当前读、加锁查询)。
- SERIALIZABLE(串行化):最高级别。强制事务串行执行,通过加读写锁实现。完全避免脏读、不可重复读、幻读,但并发性能最差,容易造成大量锁等待。
如何查看和设置隔离级别
可以通过以下语句查看当前会话或全局的隔离级别:
SELECT @@transaction_isolation;
设置当前会话的隔离级别(重启后失效):
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
设置全局隔离级别(需 SUPER 权限,新连接生效):
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
实际开发中怎么选
大多数业务场景下,REPEATABLE READ 是合理默认值。它在数据一致性和并发性能间取得较好平衡。
- 高并发、强一致性要求不高(如日志记录、统计报表),可用 READ COMMITTED 提升并发度。
- 涉及金融、账务等对数据绝对一致敏感的操作,可考虑在关键语句上显式加锁(如 SELECT ... FOR UPDATE),而不必全局升到 SERIALIZABLE。
- 不建议使用 READ UNCOMMITTED,除非你明确知道后果且有特殊优化需求。
注意 MVCC 和锁机制的影响
InnoDB 不是单纯靠隔离级别“开关”来实现效果,而是结合 MVCC(快照读)和锁(当前读)共同作用:
- 普通 SELECT 是快照读,走 MVCC,看到的是事务开始时的一致性视图。
- SELECT ... FOR UPDATE、UPDATE、DELETE 等属于当前读,会加锁并看到最新已提交数据,也可能触发间隙锁防止幻读。
- 所以即使在 REPEATABLE READ 下,不同类型的读行为表现可能不同——这点常被忽略。










