共享锁,排他锁,意向共享锁,意向排他锁

image.png
innoDB行锁的实现方式:
InnoDB行锁是通过给索引上的索引项加锁类实现的.如果没有索引,那么InnoDB将通过隐藏的聚簇索引来对记录加锁.
InnoDB行锁分为3项:
- Record Lock: 单个行记录上的锁
- Gap Lock :间隙锁,锁定一个范围,但不包含本身
- Next-Key Lock : Gap Lock+ Recork Lock,锁定一个范围,并且锁定记录本身.
InnoDB这种行锁实现特点以为着:如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果与表锁无异.
1)不通过索引条件查询时,InnoDB会锁定表中所有记录.通过索引只会锁定复合条件的记录(查询用 for update 加排他锁)

image.png

image.png
2)如果使用了相同的索引键,即使是访问不同的行业会发生锁冲突

image.png
3)当表中有多个索引,不同事物可以使用不同的索引锁定不同的行,不论是主键索引,唯一索引,还是普通索引,都会锁定的是行级锁.但是如果存在相同的记录,则会发生锁冲突.

image.png
4)即便是使用了索引字段,但是是否真的使用索引是有MySQL通过执行计划决定的,索引也有可能进行的全表扫描,那么也是相对于锁整个表.
间隙锁:
当我们用范围条件而不是相等条件检索数据时,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做间隙锁.

image.png

image.png
死锁:

image.png