MySQL面试题(二)

事务的四大特性ACID

  1. 原子性,通过undo log来保证
  2. 一致性,通过原子性+持久性+隔离性
  3. 隔离性,通过多版本并发控制和锁来保证
  4. 持久性,通过redo log来保证

Read View在MVCC里是如何工作的

Read View有四个字段:

  1. m_ids:指的是在创建Read View时,当前数据库中活跃事务的事务id列表,不包括他本身
  2. min_tx_id:m_idx中的最小值
  3. max_trx_id:创建 Read View 时,下一个将要分配给新事务的事务 id 值
  4. creator_trx_id:创建改Read View的事务的事务id

聚簇索引包含两个隐藏列:

  1. trx_id:记录正在更改索引记录的事务的事务id
  2. roll_pointer:是一个指针,指向每一个旧版本的记录

通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制)。

  1. 当trx_id小于Read View中的min_trx_id时,该版本对当前事务可见
  2. 当trx_id大于等于Read View中的max_trx_id时,该版本对当前事务不可见
  3. 当trx_id在Read View中的m_ids列表中时,生成该版本的事务仍在活跃,该版本对当前事务不可见
  4. 当trx_id不在Read View中的m_ids列表中时,该版本对当前事务可见

幻读的解决办法

  1. 对于快照读,通过MVCC方式解决,在可重复读隔离级别下,其他事务插入数据,是没有干扰的
  2. 对于当前读,通过next-key lock(记录锁+间隙锁)方式解决,在next-key lock锁范围内插入语句会被阻塞,可以避免幻读问题

读已提交与可重复读在Read View上的不同

  1. 读已提交是在每一个select都会生成一个新的Read View,当事务期间多次读取数据,两次读取到的版本不同,数据也不同
  2. 可重复读是在启动事务时生成一个Read View,整个事务期间都用这一个Read View

undo log、redo log、binlog作用

  1. undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC
  2. redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复
  3. binlog(归档日志):是Server 层生成的日志,主要用于数据备份和主从复制;