综述

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读 性能
READ UNCOMMITTED Yes Yes Yes No 不会比其他级别好太多
READ COMMITED No Yes Yes No
REPEATABLE READ No No Yes No
SERIALIZABLE No No No Yes 可能导致超时和所争用
  • READ UNCOMMITED(未提交读)

该级别中,一个事务的修改即使没有提交,对其他事务也是可见的:事务可以读取未提交的数据

缺陷

读脏数据(Dirty Read):一个事务在开始后修改了某个数据,但是最后由于某些原因并没有commit,这次修改理论上应该是无效的,但其他事务却可能读取到修改后的值。

性能

不会比其他级别好太多。

  • READCOMMITTED(提交读)

是大多数数据库系统的默认隔离级别(但MySQL不是)。
事务从开始到提交之前,所作的修改对其他事务都是不可见的。

缺陷

*不可重复读:执行两次同样的查询,可能会得到不同的结果。

  • REPEATABLE READ(可重复读)

是MySQL的默认事务隔离级别。
解决了不可重复读和脏读问题。

缺陷

幻读:之前的事务在读取某个范围内的记录时,另外的事务在该范围内插入新数据时,之前的事务再次读取该范围的记录会产生幻行。

InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决幻读问题。

  • SERIALIZABLE(可串行化)

最高的隔离级别。强制事务串行执行,解决了幻读问题。

缺陷

可能导致大量超时和锁争用:SERIALIZABLE会在读取的每一行数据上都加锁。