MySQL 隔离级别

70

SQL标准定义了四个隔离级别:读未提交、读已提交、可重复读和串行化。这四个级别主要是为了解决并发事务中可能出现的脏读、不可重复读和幻读等问题。而MySQL默认的隔离级别是可重复读

读未提交是最低的级别,可能允许脏读,也就是一个事务可以读到另一个未提交事务的修改。

读已提交解决了脏读,但可能还存在不可重复读的问题,比如同一事务两次读取同一数据可能结果不同。

可重复读解决了不可重复读,但在标准中可能允许幻读,不过MySQL通过MVCC在可重复读级别下避免了幻读

串行化通过锁机制彻底避免所有并发问题,但性能开销最大

1. 读未提交(Read Uncommitted)

特点:事务可以读取其他事务未提交的修改(脏读)。

允许的问题:

  • 脏读(可能读到未提交的无效数据)

  • 不可重复读(同一事务多次读取同一数据结果不同)

  • 幻读(同一查询返回不同行数)

适用场景:对数据一致性要求极低,追求高并发性能的场景(极少使用)。

2. 读已提交(Read Committed)

特点:事务只能读取其他事务已提交的修改。

解决的问题:脏读。

允许的问题:

  • 不可重复读(同一事务多次读取同一数据可能不同,因其他事务已提交修改)

  • 幻读(其他事务插入或删除行导致结果集变化)

实现机制:通过 MVCC(多版本并发控制)或行锁实现。

适用场景:大多数数据库的默认级别(如 Oracle),适合需要平衡一致性和性能的场景。

3. 可重复读(Repeatable Read)

特点:事务内多次读取同一数据的结果一致,即使其他事务提交修改。

解决的问题:脏读、不可重复读。

允许的问题:

  • 幻读(根据 SQL 标准允许,但 MySQL 通过 MVCC 和 Next-Key 锁避免了幻读)

实现机制:

  • MySQL 默认隔离级别。

  • 使用 MVCC 在事务开始时创建一致性快照。

  • 通过 Next-Key 锁(行锁 + 间隙锁)防止其他事务插入新行。

适用场景:需要事务内数据一致性(如金融系统)。

4. 串行化(Serializable)

特点:强制事务串行执行,完全隔离。

解决的问题:脏读、不可重复读、幻读。

实现机制:通过严格的锁机制(如范围锁)阻塞并发操作。

缺点:性能开销最大,并发度最低。

适用场景:严格要求数据一致性,可接受低并发的场景。

对比表格

隔离级别

解决脏读

解决不可重复读

解决幻读

性能

实现机制

读未提交

最高

无锁或极简锁

读已提交

较高

MVCC(每次读新快照)

可重复读

中等

事务级快照 + Next-Key 锁

串行化

最低

严格锁机制(范围锁)

注意事项

MySQL 在「可重复读」级别下通过 Next-Key 锁避免了幻读(与 SQL 标准不同)。

幻读的解决依赖于具体实现,其他数据库(如 PostgreSQL)的「可重复读」可能允许幻读。

简单总结

选择隔离级别需权衡数据一致性与并发性能

MySQL 默认的「可重复读」在多数场景下平衡较好,而「串行化」仅在极端一致需求时使用。