MySQL面试题(二)
📅 2026/7/11 3:10:15
👁️ 阅读次数
📝 编程学习
事务的四大特性ACID
- 原子性,通过undo log来保证
- 一致性,通过原子性+持久性+隔离性
- 隔离性,通过多版本并发控制和锁来保证
- 持久性,通过redo log来保证
Read View在MVCC里是如何工作的
Read View有四个字段:
- m_ids:指的是在创建Read View时,当前数据库中活跃事务的事务id列表,不包括他本身
- min_tx_id:m_idx中的最小值
- max_trx_id:创建 Read View 时,下一个将要分配给新事务的事务 id 值
- creator_trx_id:创建改Read View的事务的事务id
聚簇索引包含两个隐藏列:
- trx_id:记录正在更改索引记录的事务的事务id
- roll_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 View
undo log、redo log、binlog作用
- undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC
- redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复
- binlog(归档日志):是Server 层生成的日志,主要用于数据备份和主从复制;
编程学习
技术分享
实战经验