read uncommited 读到未提交
- 事务中的修改,即时没有提交,对其他事务也是可见的
- 事务可以读到未提交的数据(脏读)
- 性能比其他级别好
- 实际很少使用
- 问题: 脏读 不可重复读 幻读
read commited 读到提交
- 大多数数据库系统的默认隔离级别(mysql 不是,mysql为 可重复读)
- 满足隔离性(一个事务开始时,只能看到已经提交的事务所做的修改)
- 也叫不可重复读(nonrepeatable read),因为执行两次同样的查询,可能会得到不一样的结果
- 问题: 不可重复读 幻读
repeatable read 可重复读
- Mysql 默认隔离级别
- 解决了脏读问题
- 该级别保证了在同一事务中,多次读取同样的记录,结果是一致的
- 可能会产幻读(phantom read)[ 幻读在可重复读的模式下才会出现,其他隔离级别中不会出现 ]
所谓幻读,指的是当某个事务(用户a读数据)在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录(数据库在此范围内插入了一条数据),当之前的事务再次读 取该范围的记录时,会产生幻行(Phantom Row)
InnoDB和XtraDB 存储引擎通过多版并发控制(MVCC ,Multivesion Concurrency Control )解决了幻读问题。
- 问题: 幻读
serializable 串行事务
- 最高的隔离级别
- 通过强制事务串行,避免了前面说的幻读问题
- SERIALIZABLE会在读的每一行数据上 都加上锁,所以可能导致大量的超时和锁征用问题
- 实际应用中也很少用
- 问题: 加锁读
图示
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
read uncommited | Y | Y | Y | N |
read commited | N | Y | Y | N |
repeatable read | N | N | Y | N |
serializable | N | N | N | Y |
参考 https://blog.csdn.net/Yin_Xian/article/details/78481267