请教关于 mysql 临键锁工作模式的问题

26 天前
 lasuar

建表

CREATE
DATABASE IF NOT EXISTS testdb;
use
testdb;
-- 注意:必须为条件列建立非唯一索引,否则锁全表,下文会验证
CREATE TABLE students_nk_lock
(
    id    INT PRIMARY KEY,
    name  VARCHAR(50),
    score INT,
    key   idx_score(score)
);

INSERT INTO students_nk_lock (id, name, score)
VALUES (1, 'Alice', 85),
       (4, 'Bob', 90),
       (7, 'Carol', 95),
       (10, 'Lucy', 100);

版本 5.7 ,默认 RR 级别。

事务 A

BEGIN;
SELECT * FROM students_nk_lock WHERE score >= 90 FOR UPDATE;

事务 B

BEGIN;


INSERT INTO students_nk_lock VALUES(0, 'Dave', 83); -- 阻塞
INSERT INTO students_nk_lock VALUES(2, 'Dave', 84); -- 阻塞
UPDATE students_nk_lock SET score=85 WHERE score=85; -- 阻塞


INSERT INTO students_nk_lock VALUES(5, 'Dave', 85); -- 阻塞
INSERT INTO students_nk_lock VALUES(5, 'Dave', 91); -- 阻塞
INSERT INTO students_nk_lock VALUES(11, 'Dave', 101); -- 阻塞

疑问

对于普通索引,按个人理解应该是锁住 ({1, 85} -> +inf) 这段索引记录范围,然而实测貌似锁了全表,甚是不解!来请教相关大佬

666 次点击
所在节点    MySQL
3 条回复
wenxueywx
26 天前
SELECT * FROM students_nk_lock WHERE score >= 90 FOR UPDATE;
wenxueywx
26 天前
查询走的全表扫描吧
你 explain 看看
lasuar
26 天前
@wenxueywx #2 嗯,你说的对,谢谢哥们,给我一个思路了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1045592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX