BlessingCR’s Blog
BlessingCR’s Blog

间隙锁Gap Lock

CREATE TABLE z (

  id INT PRIMARY KEY AUTO_INCREMENT,

  b  INT,

  KEY b(b)

) ENGINE = InnoDB DEFAULT CHARSET = utf8;

INSERT INTO z 

  (id, b)

VALUES 

  (1, 2),

  (3, 4),

  (5, 6),

  (7, 8),

  (9, 10);

session A:

BEGIN;

SELECT * FROM z WHERE b = 6 FOR UPDATE;

session B:

INSERT INTO z VALUES (2, 4);/*success*/

INSERT INTO z VALUES (2, 8);/*blocked*/

INSERT INTO z VALUES (4, 4);/*blocked*/

INSERT INTO z VALUES (4, 8);/*blocked*/

INSERT INTO z VALUES (8, 4);/*blocked*/

INSERT INTO z VALUES (8, 8);/*success*/

INSERT INTO z VALUES (0, 4);/*blocked*/

INSERT INTO z VALUES (-1, 4);/*success*/

加锁过程

  1. 在索引 b 上的等值查询,给索引 b 加上了 next-key lock (4, 6];索引向右遍历,且最后一个值不满足条件时退化为间隙锁;所以会再加上间隙锁 (6,8);所以索引 b 上的 next-key lock 的范围是(b=4,id=3)到(b=6,id=5)这个左开右闭区间和(b=6,id=5)到(b=8,id=7)这个开区间。(读起来有点绕口,看不懂的可以看下文中的图)
  1. for update 会给 b = 6 这一行加上行锁;因此 (b=6,id=5) 这一行上有行锁

发表回复

textsms
account_circle
email

  • What¦s Taking place i’m new to this, I stumbled upon this I have found It absolutely useful and it has aided me out loads. I am hoping to give a contribution & aid other users like its aided me. Great job.

    1 月前 回复

BlessingCR’s Blog

间隙锁Gap Lock
CREATE TABLE z (   id INT PRIMARY KEY AUTO_INCREMENT,   b  INT,   KEY b(b) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; INSERT INTO z&nbs…
扫描二维码继续阅读
2023-02-21