锁
全局锁
全局锁的典型使用场景是,做全库逻辑备份。 命令:Flush tables with read lock
推荐是用mysqldump
导数时,加上–single-transaction
,启动一个事务,来触发MVCC。
表级锁
表锁的语法是 lock tables … read/write
另一类表级的锁是MDL(metadata lock)
当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁
行锁
在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议
MVCC具体实现
Inodb会对每个表增加三个隐藏字段
- DB_TRX_ID 当前行事务ID
- DB_ROW_ID 如果没有设置主键,会生成该隐藏主键字段
- DB_ROLL_PTR 对应到undolog中的回滚版本
Undolog中会存每次修改记录的前记录,存放的是一个链表
readView 事务在进行快照读的时候产生的读视图
- TRX_LIST 系统活跃事务id列表
- UP_LIMIT_ID 列表中最小的事务id
- LOW_LIMIT_ID 系统尚未分配的下一个事务id
重要点
- redo log 主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗。