事务隔离级别

SQL 标准(由 ANSI 定义)规定的四个隔离级别:

  1. Read Uncommitted(读未提交)
  2. Read Committed(读已提交)
  3. Repeatable Read(可重复读)
  4. Serializable(可串行化)

Read Uncommitted(读未提交)

最低隔离级别。

允许读取其他事务尚未提交的数据

会产生:

  • 脏读
  • 不可重复读
  • 幻读

Read Committed(读已提交)

只能读到已提交的数据

解决:

  • 脏读

仍然可能发生:

  • 不可重复读
  • 幻读

这是很多数据库的默认级别(比如 Oracle Corporation 的数据库)。

理解方式:每次读取时,都读取“当前最新已提交版本”。


Repeatable Read(可重复读)

保证同一事务内,多次读取同一行结果一致。

解决:

  • 脏读
  • 不可重复读

理论上仍可能:

  • 幻读

但这里有一个现实与标准的微妙差异。
在Oracle Corporation体系中,Repeatable Read仍可能幻读;
但在Oracle Corporation之外的常见实现——比如MySQL的InnoDB——通过MVCC + 间隙锁,在Repeatable Read下基本解决了幻读问题。

这说明一个重要事实:

SQL 标准定义的是“现象”,不是“实现方式”。

数据库厂商可以用更强的实现覆盖标准现象。


Serializable(可串行化)

最高隔离级别。

效果等同于:

所有事务一个一个排队执行。

完全避免:

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

代价:

  • 大量锁
  • 并发性能显著下降

它保证逻辑上的“时间顺序一致性”。


四个级别对比

隔离级别 脏读 不可重复读 幻读
Read Uncommitted
Read Committed ×
Repeatable Read × × √ (标准) / ≈× (InnoDB)
Serializable × × ×

总结

事务的隔离级别是指多个事务并发执行时,数据库为了解决数据一致性问题所提供的不同隔离程度。SQL标准(由 ANSI 制定)定义了四种隔离级别,用来控制并发可能带来的脏读、不可重复读和幻读问题。

第一种是Read Uncommitted,读未提交。
允许读取其他事务未提交的数据,因此可能产生脏读、不可重复读和幻读。实际生产中几乎不用。

第二种是Read Committed,读已提交。
只能读取已提交的数据,解决了脏读问题,但仍可能出现不可重复读和幻读。很多数据库默认是这个级别,比如Oracle Corporation的数据库。

第三种是Repeatable Read,可重复读。
保证同一事务中多次读取同一行数据结果一致,解决了脏读和不可重复读。
在SQL标准中仍可能出现幻读,但在MySQL的InnoDB中,通过MVCC和间隙锁机制基本解决了幻读问题。MySQL默认隔离级别就是Repeatable Read。

第四种是Serializable,可串行化。
通过加锁让事务串行执行,完全避免并发问题,但并发性能较低。

如果面试官继续追问实现原理,你可以补一句:
InnoDB主要通过MVCC(多版本并发控制)实现读操作的隔离,通过undo log构建版本链,并通过read view判断当前事务可见的数据版本;写操作则通过行锁和间隙锁控制。

隔离级别越高,一致性越强,但并发性能越低。实际选择需要在数据一致性和系统吞吐量之间做权衡。