2. 隔离级别
Q: 什么是脏读、不可重复读、幻读?
脏读(Dirty Read)
一个事务读取到了另外一个事务没有提交的数据。
不可重复读(Non-Repeatable Read)
在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据。
幻读(Phantom Read)
事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了。
三者的区别
幻读和不可重复读都是读取了另一条已经提交的事务(这点与脏读不同),所不同的是不可重复读可能发生在update、delete操作中,而幻读发生在insert操作中
不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据
幻读和不可重复读的区别:读取了另一条已经提交的事务,不同的是不可重复读的重点是修改,幻读的重点在于新增或者删除(两次读取数据行数不一致)
Q: MySQL的隔离级别有哪些?
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| 读未提交 Read Uncommitted | ✅ | ✅ | ✅ | 可能读取到其他会话中未提交事务修改的数据 |
| 读已提交 Read Committed (Oracle默认) | ❌ | ✅ | ✅ | 只能读取到已经提交的数据,可以阻止脏读 |
| 可重复读 Repeatable Read (MySQL默认) | ❌ | ❌ | ✅ | 对同一字段的多次读取结果都是一致的,可以阻止脏读和不可重复读 |
| 串行化 Serializable | ❌ | ❌ | ❌ | 所有的事务依次逐个执行,完全不可能产生干扰 |
面试重点:MySQL默认隔离级别是可重复读,Oracle默认是读已提交。隔离级别越高,并发性能越低。