行锁类型 | 含义 |
---|---|
记录锁(record lock) | 锁定一条记录,分为X和S,X锁是排它锁 |
间隙锁(gap lock) | 锁定一个区间内的记录,开区间 |
临健锁(next-key lock) | 是记录锁和间隙锁的结合体,锁定一个区间内的记录,左开右闭 |
行锁的存在是为了解决幻读的问题,在添加了临健锁的场景中如果使用间隙锁或记录锁能够解决幻读,则会进行锁降级。
临健锁降级锁 | 场景 |
---|---|
记录锁(record lock) | 1.聚簇索引/唯一索引等值查询且存在; 2.聚簇索引/唯一索引范围查询且大于等于值存在,则该值锁对于的行使用记录锁,大于改行的记录会继续使用临健锁; 3.非唯一索引等值查询且存在,等值查询的值对于的主键索引会加记录锁; |
间隙锁(gap lock) | 1.聚簇索引/唯一索引等值查询且不存在,将前一个和后一个记录区间加上间隙锁,即可避免当前值被其他事务创建; 2.聚簇索引/唯一索引小于查询,终止范围查询的记录并不需要包含在锁内,因此会降级为间隙锁; 3.聚簇索引/唯一索引范围查询小于等于查询且不存在,终止范围查询的记录并不需要包含在锁内,因此会降级为间隙锁; 4.非唯一索引等值查询且存在,终止范围查询的记录与等值查询的值之间会降级为间隙锁; 5.非唯一索引等值查询且不存在,终止范围查询的记录会降级为间隙锁; |
对于有加锁特性的语句,如果查询条件没有命中索引,那么就需要全表扫描对每行记录都新增临健锁,相当于锁全表,因此一定要注意此类语句的执行。