InnoDB|带你认识什么是MySQL的内存架构和索引说明( 七 )


如果二级索引记录被标记为删除 , 或者二级索引页被新的事务更新 , 覆盖索引记录就不会被使用 。 InnoDB不会从索引结构里返回值 , 而是会从聚簇索引里查找记录
MVCC和幻读幻读 , 同一个事务里连续执行两次同样的SQL , 可能导致不同结果的问题 。 第二次sql语句可能会返回之前不存在的行 。

  • 在快照读情况下 , 通过mvcc来避免幻读
    mvcc利用历史版本信息(快照)来控制它能读取的数据范围
  • 在当前读情况下 , 通过next-key锁来避免幻读
  • 快照读
    简单的select操作
    Read Committed: 每次select都生成一个快照读
    Repeatable read: 开启事务后第一个select语句才是快照读的地方 , 而不是一开启事务就快照读
  • 当前读
    读取最新版本的记录(即使别的事务提交的数据也能查询到) , 并且对读取的记录加锁 , 阻塞其他事务同时改动相同记录 , 避免出现安全问题 。
    会让insert\\update\\delete阻塞
select ... lock in share mode
select ... for update
insert
update
delete

在RR级别:
  • 快照读通过MVCC和undo log来实现
  • 当前读通过加record lock(记录锁)和gap lock(间隙锁)来实现
MySQL事务的实现原理
  • 事务的原子性是通过undo log来实现的
  • 事务的持久性是通过redo log来实现的
  • 事务的隔离性是通过(读写锁+MVCC)来实现的
  • 事务的一致性 , 是通过原子性、持久性、隔离性来实现的
binlogbinlog包含描述数据库更改(如表创建操作或表数据变更)的“事件” 。 除非使用基于行的日志记录 , 否则它还包含可能已进行更改的语句的事件(例如不匹配任何行的删除) 。 binlog还包含更新数据时每个语句花费了多长的时间 。
类型
  • STATEMENT 日志记录基于语句
  • ROW 日志记录基于行 。 默认方式
  • MIXED 日志记录使用混合格式(默认基于语句 , 特定情况下切换到基于行)
MySQL默认隔离级别为什么是可重复读
  • 数据库默认隔离级别
    mysql-可重复读; oracle PostgreSQL-读已提交
  • 为什么mysql用可重复读(RR)而不是读已提交(RC)
    5.0之前只有statement一种格式 , 主从复制会存在大量的不一致 , 故选用RR
  • 【InnoDB|带你认识什么是MySQL的内存架构和索引说明】为什么默认隔离级别很多选用RC
    -- 可重复读RR存在间隙锁 , 会使死锁的概率增大;在可重复读下 , 条件列未命中索引会锁表;在读已提交RC下 , 只锁行
    -- 在读已提交RC下 , 引入半一致读(semi-consistent)特性增加了update操作的并发性能
    -- 不可重复读在开发中是可以接受的