Read Uncommitted(未提交读)
- 事务可以读取未提交的数据,也被称为脏读(Dirty Read)
-
Read Committed(提交读)
未提交的数据对于其他事务是不可见
- 也叫做不可重复读(Nonrepeatable Read):两次相同的查询的结果可能不一样
-
Repeatable Read(可重复读)
该级别可以保证在同一个事务中的多次查询的结果是一样的
- 可能会遇到幻读(Phantom Read)的问题
- 幻读是指当某个事务读取某个范围内的记录时,其他事务在该范围内插入了新的记录,这时候之前的事务再次读取该范围内的记录时,会产生幻行(Phantom Row)
- InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题
-
Serializable(可串行化)
最高级别的隔离级别,通过强制事务串行执行,避免幻读等问题
- 该隔离级别会在读取的每一行数据上都加上锁
- 实际应用中一般很少使用
ANSI SQL隔离级别对比
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
Read Uncommitted | ✅ | ✅ | ✅ | ❌ |
Read Committed | ❌ | ✅ | ✅ | ❌ |
Repeatable Read | ❌ | ❌ | ✅ | ❌ |
Serializable | ❌ | ❌ | ❌ | ✅ |
参考书籍:《高性能MySQL》