目标:Mysql非唯一索引范围查询时,间隙锁是怎么工作的
工作示例
需要在事务隔离级别:可重复读 (URL:Mysql设置事务隔离级别方法)
使用一个窗口,运行Sql语句。(示例表/数据在下面)
TXA
-- 窗口1
begin;
select * from t3 where c between 20 and 30 for update;
图表示例
首先等值查询20,不是唯一索引,锁定(10,20]
向右扫描至30,锁定(20,30]
向右扫描,锁(30,40]
40不符合,然后取消锁
辅助索引c | 记录值↓ | 间隙↓ | 红色是被锁 | ||||||||||
(-♾️,0) | 0 | (0,10) | 10 | (10,20) | 20 | (20,30) | 30 | (30,40) | 40 | (40,50) | 50 | (50,+♾️) | +♾️ |
↓
辅助索引c | 记录值↓ | 间隙↓ | 红色是被锁 | ||||||||||
(-♾️,0) | 0 | (0,10) | 10 | (10,20) | 20 | (20,30) | 30 | (30,40) | 40 | (40,50) | 50 | (50,+♾️) | +♾️ |
示例结构/数据
表结构
CREATE TABLE `t3` (
`id` INT ( 11 ) NOT NULL,
`c` INT ( 11 ) DEFAULT NULL,
`d` INT ( 11 ) DEFAULT NULL,
PRIMARY KEY ( `id` ),
KEY `c` ( `c` )
) ENGINE = INNODB;
数据
INSERT INTO t3
VALUES
( 0, 0, 0 ),
( 10, 10, 10 ),
( 20, 20, 20 ),
( 30, 30, 30 ),
( 40, 40, 40 ),
( 50, 50, 50 );
Comments 1 条评论