跳至内容

2. 隔离级别

Q: 什么是脏读、不可重复读、幻读?

脏读(Dirty Read)

一个事务读取到了另外一个事务没有提交的数据。

不可重复读(Non-Repeatable Read)

在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据。

幻读(Phantom Read)

事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了。

三者的区别

  1. 幻读和不可重复读都是读取了另一条已经提交的事务(这点与脏读不同),所不同的是不可重复读可能发生在update、delete操作中,而幻读发生在insert操作中

  2. 不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据

  3. 幻读和不可重复读的区别:读取了另一条已经提交的事务,不同的是不可重复读的重点是修改,幻读的重点在于新增或者删除(两次读取数据行数不一致)

Q: MySQL的隔离级别有哪些?

隔离级别脏读不可重复读幻读说明
读未提交
Read Uncommitted
可能读取到其他会话中未提交事务修改的数据
读已提交
Read Committed
(Oracle默认)
只能读取到已经提交的数据,可以阻止脏读
可重复读
Repeatable Read
(MySQL默认)
对同一字段的多次读取结果都是一致的,可以阻止脏读和不可重复读
串行化
Serializable
所有的事务依次逐个执行,完全不可能产生干扰
面试重点:MySQL默认隔离级别是可重复读,Oracle默认是读已提交。隔离级别越高,并发性能越低。