金不三,银不四的高频面试题中,MySQL的事务特性,隔离级别等问题也是非常经典八股文之一,面对此种问题,估计绝大数小伙伴也是信手拈来的事情:
事务特性(ACID):原子性
(Atomicity
)、隔离性
(Isolation
)、一致性
(Consistency
)和持久性
隔离级别:读取未提交
(READ UNCOMMITTED
),读取已提交
(READ COMMITTED
),可重复读
(REPEATABLE READ
),可串行化
(SERIALIZABLE
)
而每一种隔离级别导致的问题有:
READ UNCOMMITTED
隔离级别下,可能发生脏读
、不可重复读
和幻读
问题READ COMMITTED
隔离级别下,可能发生不可重复读
和幻读
问题,但是不可以发生脏读
问题REPEATABLE READ
隔离级别下,可能发生幻读
问题,但是不可以发生脏读
和不可重复读
的问题SERIALIZABLE
隔离级别下,各种问题都不可以发生
对于MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读),从上面的SQL标准的四种隔离级别定义可知,REPEATABLE-READ(可重复读)
是不可以防止幻读的,但是我们都知道,MySQL InnoDB存储引擎是解决了幻读问题发生的,那他又是如何解决的呢?
1. 行格式
在进入主题之前,我们先大致了解一下什么是行格式,这样有助于我们理解下面的MVCC,行格式是表中的行记录在磁盘的存放方式,Innodb
存储引擎总共有4种不同类型的行格式:compact
、redundant
、dynamic
、compress
;虽然很很多行格式,但是在原理上,大体都相同,如下,为compact
行格式:
从图中可以看出来,一条完整的记录其实可以被分为记录的额外信息
和记录的真实数据
两大部分&#x