MySQL面试题(二) 事务的四大特性ACID原子性通过undo log来保证一致性通过原子性持久性隔离性隔离性通过多版本并发控制和锁来保证持久性通过redo log来保证Read View在MVCC里是如何工作的Read View有四个字段m_ids指的是在创建Read View时当前数据库中活跃事务的事务id列表不包括他本身min_tx_idm_idx中的最小值max_trx_id创建 Read View 时下一个将要分配给新事务的事务 id 值creator_trx_id创建改Read View的事务的事务id聚簇索引包含两个隐藏列trx_id记录正在更改索引记录的事务的事务idroll_pointer是一个指针指向每一个旧版本的记录通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC多版本并发控制。当trx_id小于Read View中的min_trx_id时该版本对当前事务可见当trx_id大于等于Read View中的max_trx_id时该版本对当前事务不可见当trx_id在Read View中的m_ids列表中时生成该版本的事务仍在活跃该版本对当前事务不可见当trx_id不在Read View中的m_ids列表中时该版本对当前事务可见幻读的解决办法对于快照读通过MVCC方式解决在可重复读隔离级别下其他事务插入数据是没有干扰的对于当前读通过next-key lock记录锁间隙锁方式解决在next-key lock锁范围内插入语句会被阻塞可以避免幻读问题读已提交与可重复读在Read View上的不同读已提交是在每一个select都会生成一个新的Read View当事务期间多次读取数据两次读取到的版本不同数据也不同可重复读是在启动事务时生成一个Read View整个事务期间都用这一个Read Viewundo log、redo log、binlog作用undo log回滚日志是 Innodb 存储引擎层生成的日志实现了事务中的原子性主要用于事务回滚和 MVCCredo log重做日志是 Innodb 存储引擎层生成的日志实现了事务中的持久性主要用于掉电等故障恢复binlog归档日志是Server 层生成的日志主要用于数据备份和主从复制