SQL标准定义了4种隔离级别。较低级别的隔离可以执行更高的并发,系统的开销也更低。
read uncommitted(未提交读)
事务可以读取未提交的数据,称为脏读。很少使用。
read committed(提交读)
大多数数据库系统的默认事务隔离级别都是它,但MySQL不是。一个事务从开始直到提交之前,所做的修改对其他事务是不可见的。它有时候也称为不可重复读,因为两次执行相同的查询,可能会得到不同的结果。
repeatable read(可重复读)
是MySQL的默认事务隔离级别,保证在同一个事务中执行相同的查询结果一致,解决了脏读的问题。但是它无法解决幻读的问题。幻读指的是当一个事务在读取了某个范围内的记录后,另外一个事务在该范围内插入了新的记录,则之前的事务再次读取该范围的记录时会产生幻行。InnoDB存储引擎通过多版本并发控制解决了幻读的问题。
serializable(可串行化)
是最高的隔离级别,通过强制事务串行执行,避免了幻读问题。简单地说,它会在读取的每一行数据上都加锁,会导致大量的超时和锁争用的问题。很少使用。
汇总表如下:
参考资料
《高性能MySQL》 P8-9