SQL事务隔离级别按严格性从低到高为读未提交、读已提交、可重复读、可串行化,分别对应脏读、不可重复读、幻读的防范能力递增,但性能递减;实际实现因数据库而异,选型需匹配业务一致性与性能需求。

SQL事务隔离级别解决的是多个事务同时操作同一数据时的可见性问题。核心差异在于:越高的级别越能防止并发异常,但性能开销越大;越低的级别越快,但越容易读到不一致的数据。
四种标准隔离级别的行为对比
ANSI SQL-92定义了四个基础级别,按严格程度从低到高排列:
- 读未提交(Read Uncommitted):允许读取其他事务尚未提交的修改。可能发生脏读、不可重复读、幻读。极少在生产环境使用。
- 读已提交(Read Committed):只能读到已提交的数据,避免脏读。但同一事务内多次查询可能返回不同结果(不可重复读、幻读仍存在)。Oracle默认级别。
- 可重复读(Repeatable Read):保证同一事务中多次读取相同条件的数据结果一致,避免脏读和不可重复读。MySQL默认级别,通过MVCC+间隙锁(Gap Lock)额外抑制幻读。
- 可串行化(Serializable):最高级别,强制事务串行执行。通过范围锁或表锁杜绝所有并发异常(包括幻读),但并发性能最差,容易阻塞。
各数据库的实际实现有差异
标准定义是理论框架,具体行为取决于数据库引擎如何实现:
- MySQL在可重复读下用间隙锁封锁索引区间,实际效果基本等同于防止幻读;而标准定义中它本不保证防幻读。
- SQL Server默认是读已提交,但可通过启用READ_COMMITTED_SNAPSHOT选项改用行版本控制,避免读写阻塞,同时保持逻辑上“已提交”的语义。
- PostgreSQL的可重复读基于快照隔离(SI),不发生脏读和不可重复读,但可能出现写偏斜(Write Skew),这不属于ANSI定义的三类异常,却仍是数据一致性风险。
- OceanBase在MySQL模式下支持全部四级,但在Oracle模式下仅支持读已提交和可串行化。
怎么选?关键看业务场景
没有“最好”,只有“最合适”:
- 报表统计、日志归档等对实时性要求不高、能容忍稍旧数据的场景,可用读已提交——平衡性最优。
- 金融扣款、库存扣减等强一致性场景,需确保两次读取金额/数量不变,应选可重复读或更高。
- 极低并发、强校验逻辑(如审批流终审)可考虑可串行化,但务必评估锁等待与超时风险。
- 读未提交只建议用于临时调试或非关键分析,且必须明确接受脏数据后果。
补充说明:快照隔离不是标准级别,但很常用
快照隔离(Snapshot Isolation, SI)是多数现代数据库(SQL Server、PostgreSQL、Oracle)的底层机制,它不直接对应ANSI四级,而是提供一种“事务开始时刻的数据库快照”视角:
- 读操作不加锁,不会阻塞写;写操作只在提交时检查冲突(如更新同一行)。
- 它天然避免脏读、不可重复读、幻读,但可能产生写偏斜——比如两个事务各自读取账户A余额>100,然后都给账户B转账,最终导致A透支。
- 启用方式因库而异:SQL Server需开启ALLOW_SNAPSHOT_ISOLATION;PostgreSQL通过REPEATABLE READ自动启用快照;MySQL的InnoDB不原生支持SI,其可重复读基于MVCC但不完全等价。










