我试图理解锁和索引之间的关系。
我有下表
CREATE TABLE example_table (
id INT AUTO_INCREMENT,
col1 VARCHAR(255),
col2 INT,
PRIMARY KEY (id)
);
INSERT INTO example_table (col1, col2) VALUES ('a',1);
INSERT INTO example_table (col1, col2) VALUES ('b',2);
INSERT INTO example_table (col1, col2) VALUES ('c',3);
INSERT INTO example_table (col1, col2) VALUES ('d',4);
当我在 2 个单独的事务上运行以下查询时,我得到
SELECT * FROM example_table where col1="a" FOR UPDATE;
和
SELECT * FROM example_table where col1="b" FOR UPDATE;
当运行第二个查询时,它会等待第一个查询释放独占锁。
但是如果我向 col1 添加索引,则运行这 2 个 slecet 查询不会等待彼此的锁定。
我的问题是:为什么在非
indexed上查询
select ... for update
时,谁表被锁定,而在 indexed列上查询
select ... for update
时,仅锁定所需的行?
SELECT ... FOR UPDATE
锁定它检查的每一行,而不仅仅是选定的行。
当
col1
上没有索引时,它必须检查每一行以查看条件是否为真,因此整个表被锁定。
当
col1
上有索引时,它可以使用该索引来查找符合条件的行,并且只有这些行才会被锁定。