1. MVCC
谈谈对于MVCC的理解
MVCC是指多版本并发控制,也即维护一个数据的多个版本。MVCC使用快照读提供了非阻塞读功能,使得读写操作没有冲突。MVCC的具体实现依赖于数据库记录中的三个隐藏字段、undolog日志和readView。
在MySQL中,可重复读隔离级别就是依赖于MVCC来实现的。
实现原理
(1)InnoDB数据库表记录中的隐藏字段
(2)undoLog版本链
(3)ReadView
ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护当前活跃的(未提交的)id。ReadView中包含了四个核心字段(当前活跃的事务ID集合,最小活跃事务ID, 当前最大事务ID+1, ReadView创建者的事务ID)。
2. 锁
共享锁与排他锁
表级锁与行级锁
表级锁一锁就锁住整张表。MyISAM只支持表级锁,串行化隔离级别也是通过加表锁来实现的。
行级锁的粒度更小,仅对相关的记录上锁即可,行级锁的粒度更小。
注: InnoDB的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行Update、delete语句时,如果Where条件中字段没有命中索引或者索引失效,就会导致扫描全表对表中所有记录进行加锁。
意向锁
意向锁表示某个事务正在锁定一行或者将要锁定一行,表明一个意图。它分为意向共享锁(IS)和意向排他锁(IX)。通过使用意向锁,可以避免在加表锁前对每一条记录的遍历。
意向锁之间不会互相冲突,即意向互斥锁和意向共享锁是可以并存的。 意向锁不会与行级别的锁进行冲突,只会与表级别的互斥。
行级锁的分类
(1) 记录锁
锁定单个行记录的锁,防止其他事务对此进行update和delete。在RC、 RR隔离级别下都支持。
(2)间隙锁
锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert, 产生幻读。在RR隔离级别下都支持。
(3)临键锁
行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙。在RR隔离级别下支持。