2024-11-09
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/2037369282

回答

是的,Update 语句 where 条件字段没加索引会锁全表。详细过程如下:

1、InnoDB 引擎支持行锁,当隔离级别为可重复读时,即 InnoDB 默认的事务隔离级别,**其加锁的基本单位是 next-key 锁(记录锁 + 间隙锁)。**next-key lock 会锁住记录本身和记录之间的“间隙”,防止其他事务在这个记录区间插入新的记录,从而避免幻读现象。

2、InnoDB 间隙锁是在索引上而非行上。

3、where 条件字段没有使用索引,那么会全表扫描。相应的会对所有的记录加上 next-key 锁(gap lock + record lock),相当于把整个表锁住。

InnoDB 引擎如何实现行锁?

扩展

一、数据准备

CREATE TABLE `t_user` (
  `id` int NOT NULL,
  `age` int NOT NULL,
  `name` varchar(255) NOT NULL default '',
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB;

insert into t_user(id,age,name) values (1, 10, 'ab');
insert into t_user(id,age,name) values (6, 20, 'f');
insert into t_user(id,age,name) values (25, 25, 'ee');
insert into t_user(id,age,name) values (100, 100, 'ff');
insert into t_user(id,age,name) values (200, 200, 'gg');