行锁
行锁在 InnoDB 中是基于索引
实现的,但是如果某个加锁操作没有使用索引,那么该锁就会退化为表锁
。
行锁的分类
记录锁(Record Locks)
记录锁就是为某行记录加锁,它封锁该行的索引记录
:
SELECT * FROM table WHERE id = 1 FOR UPDATE;
UPDATE SET age = 30 WHERE id = 1;
注意:
id
列必须为唯一索引列
或主键列
,否则上述语句加的锁就会变成临键锁
。- 同时查询语句必须为
精准匹配
(=
),不能为>
、<
、like
等,否则也会退化成临键锁
。
间隙锁(Gap Locks)
间隙锁基于非唯一索引
,锁定一段范围内的索引记录
。间隙锁基于Next-Key Locking
算法,使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据。
SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE;
所有在(1,10