理论
在mysql中,总共有两种锁 
《MySQL技术内幕》6.2
下面所有的都是基于第一种Lock锁
表锁
表级别的锁:表锁 和 MDL,其中,使用InnoDB的MySQL ,正常不会出现表锁,只有在MDL才可能出现表级别锁
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-极客时间
34 | MySQL调优之事务:高并发场景下的数据库事务调优-极客时间
36 | 记一次线上SQL死锁事故:如何避免死锁?-极客时间
行锁
两种行锁 :共享锁 、排他锁
意向锁
在事务获取行记录的S锁和X锁之前,需要获得对应表级别的意向锁;
举例来说,在对记录加X锁之前,已经有事务对表进行了S表锁,那么表1上已存在S锁,之后事务
需要对记录r在表1上加上IX,由于不兼容,所以该事务需要等待表锁操作的完成。 
《MySQL技术内幕》6.3.1
行锁实现算法
20 | 幻读是什么,幻读有什么问题?-极客时间
36 | 记一次线上SQL死锁事故:如何避免死锁?-极客时间
InnoDB 既实现了行锁,也实现了表锁。行锁是通过索引实现的,如果不通过索引条件检索数据,那么 InnoDB 将对表中所有的记录进行加锁,其实就是升级为表锁了。
行锁的具体实现算法有三种:record lock算法、gap lock 算法以及 next-key lock算法。
record lock 是专门对索引项加锁;
gap lock 是对索引项之间的间隙加锁;
next-key lock 则是前面两种的组合,对索引项以其之间的间隙加锁。
(record lock锁的就是 10 11 13 和 20;而gap Lock锁的则是开区间) 
锁降级(提高并发度):

只在可重复读或以上隔离级别下的特定操作才会取得 gap lock 或 next-key lock,在 Select 、Update 和 Delete 时,除了基于唯一索引的查询之外,其他索引查询时都会获取 gap lock 或 next-key lock,即锁住其扫描的范围。 
36 | 记一次线上SQL死锁事故:如何避免死锁?-极客时间
30 | 答疑文章(二):用动态的观点看加锁-极客时间

