sql事务隔离级别共四种:1. read uncommitted允许脏读、不可重复读和幻读;2. read committed避免脏读但仍有后两者;3. repeatable read解决脏读和不可重复读,mysql通过间隙锁基本防止幻读;4. serializable完全避免三类问题但性能最差。

SQL事务隔离级别决定了多个并发事务之间如何相互影响,直接影响数据一致性和系统性能。不同隔离级别对应不同的并发控制策略,也对应着不同类型的并发问题,比如脏读、不可重复读和幻读。
四种标准隔离级别及其特点
SQL标准定义了四个隔离级别,从低到高依次为:
- READ UNCOMMITTED(读未提交):最低级别,允许读取其他事务尚未提交的数据,可能引发脏读、不可重复读和幻读。
- READ COMMITTED(读已提交):只允许读取已提交的数据,避免脏读,但不可重复读和幻读仍可能发生(如 PostgreSQL 和 Oracle 默认级别)。
- REPEATABLE READ(可重复读):保证同一事务中多次读取相同范围数据结果一致,解决脏读和不可重复读;但标准下仍可能有幻读(MySQL InnoDB 通过间隙锁基本解决了幻读)。
- SERIALIZABLE(可串行化):最高级别,强制事务串行执行,完全避免脏读、不可重复读和幻读,但并发性能最差,常通过加范围锁或序列化调度实现。
常见并发问题与对应隔离级别的关系
每种并发问题在不同隔离级别下的表现如下:
- 脏读(Dirty Read):事务A读取了事务B未提交的修改,若B回滚则A读到无效数据。仅在 READ UNCOMMITTED 下发生。
- 不可重复读(Non-repeatable Read):事务A两次读取同一行,期间事务B更新并提交该行,导致A两次结果不一致。发生在 READ UNCOMMITTED 和 READ COMMITTED 级别。
- 幻读(Phantom Read):事务A两次执行相同范围查询(如 SELECT * FROM t WHERE id > 10),事务B在此期间插入/删除了符合该条件的新行并提交,导致A两次结果集行数不同。在 READ UNCOMMITTED、READ COMMITTED、部分 REPEATABLE READ 实现中可能出现(MySQL InnoDB 的 RR 用 Next-Key Lock 规避了典型幻读)。
实际选型建议
选择隔离级别需权衡一致性要求与并发性能:
- 金融类强一致性场景(如账户扣款)建议使用 REPEATABLE READ 或更高,确保读写逻辑稳定;
- 统计报表、日志分析等对实时性要求不高、可容忍轻微不一致的场景,READ COMMITTED 更合适;
- 避免盲目使用 SERIALIZABLE,除非业务逻辑明确要求绝对顺序执行,否则易引发大量锁等待甚至死锁;
- 注意数据库实际实现差异:例如 MySQL 默认是 REPEATABLE READ,而 PostgreSQL 和 SQL Server 默认是 READ COMMITTED,且各自对幻读的处理方式不同。
查看与设置隔离级别
常用语法示例(以 MySQL 为例):
- 查看当前会话隔离级别:
SELECT @@transaction_isolation; - 设置当前会话为 READ COMMITTED:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; - 设置全局默认级别(需 SUPER 权限):
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
应用层更推荐在事务开始时显式指定,而非依赖全局配置,便于追踪和维护。










