表级别锁
1.表锁
lock tables xx read. 线程只能读
lock tables xx write 其他线程无法读写
2.MDL锁(元数据锁
MDL 是为了对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更 ,反之亦然
注意 MDL 是在事务提交后才会释放, 因此长事务可能导致 修改表操作 阻塞
3. 意向锁
给记录加锁时,会给表级别加个特别的锁
意向锁的目的是为了快速判断表里是否有记录被加锁 ,例如判断能否加表写锁
行锁
select ... lock in share mode 读锁
select ... for update 写锁
record lock(记录锁)
间隙锁
next-key lock
在 MySQL 中使用 SELECT * FROM users WHERE id BETWEEN 100 AND 250 FOR UPDATE
时,id = 100
和 id = 250
这两个具体的行会被如何锁定,取决于数据库的索引、隔离级别以及锁类型的行为。
具体行为
- 有索引的情况下:
id = 100
和id = 250
:这两行会被**行锁(Record Lock)**明确锁定,因为它们在查询的范围内。FOR UPDATE
语句会对id = 100
和id = 250
的行加上排他锁(X 锁),使其他事务不能修改或删除这些行。- 间隙锁(Gap Lock):除了锁定
id = 100
和id = 250
的行外,MySQL 还会使用Next-Key Lock
,即在索引的情况下,它会锁定100
到250
之间的行和间隙,防止其他事务在此范围内插入新行。 - Next-Key Lock 行为:在
REPEATABLE READ
隔离级别下,锁的范围包括id = 100
之前的间隙(假设上一个id
是 90),锁定[90, 100]
的间隙,以及id = 250
和下一个id
的间隙。
示例:
假设表中有以下 id
值:
id: 90, 100, 120, 150, 200, 250, 300
执行 SELECT * FROM users WHERE id BETWEEN 100 AND 250 FOR UPDATE
后:
- 行锁:
id = 100
,id = 120
,id = 150
,id = 200
,id = 250
的行会被锁住。 - 间隙锁:锁定
90 < id < 100
和250 < id < 300
之间的间隙,防止其他事务在这些间隙内插入新行。
标签:记录,lock,间隙,id,mysql,90,100,250 From: https://www.cnblogs.com/towboa/p/18438114