理论image.png

在mysql中,总共有两种锁
83776254-38BA-4540-A4B6-06BEFA4A2F00.png
《MySQL技术内幕》6.2
下面所有的都是基于第一种Lock锁

表锁

表级别的锁:表锁 和 MDL,其中,使用InnoDB的MySQL ,正常不会出现表锁,只有在MDL才可能出现表级别锁
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-极客时间
34 | MySQL调优之事务:高并发场景下的数据库事务调优-极客时间
36 | 记一次线上SQL死锁事故:如何避免死锁?-极客时间

行锁

两种行锁 :共享锁 、排他锁

05887597-10FD-4581-AC0E-0CDD90E9B4BE.png
《MySQL技术内幕》

意向锁

在事务获取行记录的S锁和X锁之前,需要获得对应表级别的意向锁;
举例来说,在对记录加X锁之前,已经有事务对表进行了S表锁,那么表1上已存在S锁,之后事务
需要对记录r在表1上加上IX,由于不兼容,所以该事务需要等待表锁操作的完成。
C50A9108-CD66-4DDA-A9F4-10C8E260279A.png
《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锁的则是开区间)
CC8019FA-F05A-4D08-94CC-ECF25E6E0A02.png

锁降级(提高并发度):

B6B2C0D8-F918-4932-9F69-AC3ACD4669D4.png

只在可重复读或以上隔离级别下的特定操作才会取得 gap lock 或 next-key lock,在 Select 、Update 和 Delete 时,除了基于唯一索引的查询之外,其他索引查询时都会获取 gap lock 或 next-key lock,即锁住其扫描的范围。
CD789F79-6BB4-47D5-84D0-B522E3FC4522.jpg
36 | 记一次线上SQL死锁事故:如何避免死锁?-极客时间

30 | 答疑文章(二):用动态的观点看加锁-极客时间

应用

image.png

参考

1、30丨锁:悲观锁和乐观锁是什么?