事务的四个隔离级别

Mysql/InnoDB 支持四个事务隔离级别,默认是可重复读(REPEATABLE-READ)。四个事务级别逐渐增强,保证数据有更高的一致性。但级别越高,性能越差。

隔离级别 脏读 不可重复读 幻读
未提交读(Read uncommitted) 可能 可能 可能 不锁表,隔离级别最低,并发性能高
提交读(Read commited) 不可能 可能 可能 锁定正在读取的行
可重复读(Repeatable read) 不可能 不可能 可能 锁定所读取的所有行
串行读(Serializable) 不可能 不可能 不可能 锁表
  • 未提交读:允许脏读,也就是可能读取到其他会话中未提交的事务修改的数据。
  • 提交读:只能读到已经提交的数据。(不重复读)
  • 可重复读:在同一个事务内的查询都是事务开始时刻是一致的,InnoDB的默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还是存在幻读。
  • 串行读:完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

脏读(dirty read):指当一个事务正在访问数据,并且对数据进行了修改,而该次修改还没有提交到数据库中。这时,另一个事务也访问这个数据,然后使用了这个数据。

不可重复读(nonrepeatable read):指在一个事务内,多次读同一数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务中的俩次读数据之间,由于第二个事务的修改,和第一个事务读取到的数据可能是不一样的。这样就发生了在一个事务内俩次读到的数据是不一样的,因此称为不可重复读。(不可重复读在于修改同样条件的数据)

幻读(phantom read):第一个事务对一个表中的数据做了修改,这个修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,插入一行新的数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。(幻读是在于新增或删除表中数据)