MySQL表锁与Next-Key Lock行锁的区别及行锁算法配置咨询
MySQL表锁与Next-Key Lock的核心区别及行锁算法配置说明
一、表锁和Next-Key Lock的本质差异
你之前的理解有个关键误区:Next-Key Lock绝对不是表锁,两者的核心区别体现在这几个方面:
- 锁定范围天差地别:表锁直接锁定整个表的所有记录,连表结构修改都会被阻塞,和你操作的数据范围无关;而Next-Key Lock只锁定查询涉及的特定范围记录,以及这些记录之间的间隙——比如你执行
where age between 20 and 30,只会锁age在20-30之间的行,以及这些行前后的间隙,其他age不在该范围的行完全不受影响。 - 并发能力完全不同:表锁粒度极大,一旦锁表,其他线程的写操作(甚至部分读操作)都会被卡住,并发效率极低;Next-Key Lock属于行级锁的扩展,只锁必要范围,其他行的读写操作可以正常进行,并发能力远高于表锁。
- 触发场景不一样:表锁常见于MyISAM这类非事务引擎,或是InnoDB中执行
ALTER TABLE、LOCK TABLES这类语句时触发;Next-Key Lock是InnoDB在RR(可重复读)隔离级别下,针对非唯一索引查询、无索引查询或范围查询自动触发的,目的是解决幻读问题。
二、行锁算法的控制方式
InnoDB没有直接指定行锁算法的配置项,但可以通过两种方式控制实际使用的锁类型:
- 调整事务隔离级别:如果把隔离级别从默认的RR改成RC(读已提交),InnoDB会自动关闭Gap Lock(间隙锁)和Next-Key Lock,只使用Record Lock(纯行锁)。不过这么做会失去幻读防护,需要结合业务场景权衡。
- 优化查询条件:当查询使用**唯一索引(主键或唯一约束)**且为精准匹配时(比如
where id=100,id是主键),InnoDB会自动把Next-Key Lock降级为Record Lock,只锁目标行;只有当查询用非唯一索引、无索引,或是范围查询(比如id>100)时,才会触发Next-Key Lock。
内容的提问来源于stack exchange,提问作者great-jin
相关产品推荐
相关产品推荐

