锁的分类
image.png行锁
记录锁
针对索引记录的锁定,锁加在索引上
间隙锁
索引之间的间隙、第一个索引之前的间隙、最后一个索引之后的间隙加锁
Next-key锁
一条记录的记录锁加上该记录前面的间隙锁
等值查找
对主键的等值查找(for update)
表上的意向排他锁(IX)
记录存在:next-key退化为记录锁(索引记录上的排他锁(X))
记录不存在:next-key退化为间隙锁
对非主键的唯一索引的等值查找(for update)
表上的意向排他锁(IX)
主键索引上的排他锁(X)
记录存在:next-key退化为记录锁(索引记录上的排他锁(X))
记录不存在:next-key退化为间隙锁
普通索引的等值查找(for update)
表上的意向排他锁(IX)
主键索引上的排他锁
记录存在:
该记录的next-key锁
该记录到下一行记录的间隙锁
记录不存在:退化为间隙锁
锁间隙主要是为了避免幻读
无索引的情况下的等值查找(for update)
表上的意向排他锁(IX)
主键索引上的所有记录和间隙加锁,相当于锁表了
范围查找
select * from test where id >= 8 and id < 9 for update
id=8的数据存在,id=9的数据不存在,8下面一行数据id=16
唯一索引的范围查找
1, next-key lock:(4,8]
2, 唯一索引退化:8上的记录锁
3, 范围查找,找到下一行id=16,间隙锁为(8,16]
4, 不满足id<9则退化为间隙锁(8,16)
普通索引的范围查找,不会退化
查看加锁情况
show engine innodb status
网友评论