MySQL 事务隔离级别

读未提交(read-uncommitted)#

所有事务都可以看到其他未提交事务的执行结果。

很少实际应用,因为性能上既不比其他级别好,也会产生脏读幻读

不可重复读(read-committed)#

大部分数据库默认隔离级别,但是非 MySql 默认级别。

一个事务只能看见已经提交事务所做的改变,会产生幻读

可重复读(repeatable-read)#

MySql 默认事务隔离级别,此级别确保同一事务的多个实例在并发读取数据时,会看见同样的数据行。

同样会产生幻读。

序列化(serializable)#

最高隔离级别,强制事务排序执行,使之不可能互相冲突,从而解决幻读问题,即在行上加上共享锁,这个级别,可能导致大量超时现象和锁竞争。

读取产生的问题#

脏读#

事务 A 读取了事务 B 更新的数据,然后事务 B 回滚了,A 读到的就是脏数据

幻读(phantom read)#

在读取某一范围的数据行时,另一个事务在该范围内插入新行,当用户再读取该范围的数据行,就会发现新的幻影行。

InnoDB 和 FaLcon 存储引擎通过多版本并发控制机制解决了该问题。

本作品采用《CC 协议》,转载必须注明作者和本文链接