四种隔离级别,每种级别规定了一个事务中的修改,哪些在事务内和事务间是可见的,哪些是不可见的。
较低级别的隔离通常具备更高的并发,系统的开销也更低。
四种隔离级别
READ UNCOMMITTED(未提交读)
- 事务中的修改,即使没有修改,对其他事务也都是可见的。
- 事务可读取未提交的数据,这称为“脏读(Dirty Read)”
- 易导致很多问题,性能上也并不比其他级别好太多。实际应用,不推荐使用。
READ COMMITTED(提交读)
- 多数数据库默认的隔离级别(但 MySQL 不是)
- 隔离性:一个事务开始时,只能“看见”已提交的事务所做的修改。
- 即:一个事务从开始到提交之前,所做的任何修改,对其他事务不可见。
- 这个级别又称“不可重复读(nonrepeatable read)”
REPEATABLE READ(可重复读)
- 解决了“脏读”问题
- 该级别保证了在同一个事务中多次读取同样记录的结果是一致的
- 无法解决另外一个“幻读(Phantom Read)”的问题
- 幻读:指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时,就会产生幻行(Phantom Row)。
- InnoDB 和 XtraDB 存储引擎通过多版本控制(MVCC,Multiversion Concurrency Control)解决了幻读问题。
- 该级别是 MySQL 的默认事务隔离级别
SERIALIZABLE(可串行化)
- 最高的隔离级别
- 通过强制事务串行执行,避免前面说的幻读问题
- 该级别会在读取每一行数据上都加锁,所以可能导致大量的超时和锁争用问题
- 实际应用,该级别很少使用;只有在非常需要确保数据一致性,并且接受没有并发的情况下,才会考虑使用。