Mysql 非唯一索引等值查询,加锁逻辑

发布于 2023-05-05  269 次阅读


目标:Mysql非唯一索引等值查询时,间隙锁是怎么工作的

工作示例

需要在事务隔离级别:可重复读 (URL:Mysql设置事务隔离级别方法)

使用两个窗口,运行Sql语句。(示例表/数据在下面)

TXA

查询t3表,辅助索引c等于10并且加上共享锁(Shared Locks,简称S锁,读锁)


-- 窗口1
begin;
select id from t3 where c = 10 lock in share mode;

TXB


-- 窗口2
select * from t3 where id = 20 for update;
insert into t3 value (12, 12, 12);

图表示例

辅助索引C是非唯一索引,所以首先锁间隙(0,10)和一条记录值为10的记录,然后因为不知道右面是否还有记录值为10的,所以向右扫描时间隙(10,20)和20被锁定了。

辅助索引c索引值↓间隙↓红色是被锁
(-♾️,0)0(0,10)10(10,20)20(20,30)30(30,40)40(40,50)50(50,+♾️)+♾️

↓然后因为等值查询最后一个扫描20,20锁解除

辅助索引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 );
届ける言葉を今は育ててる
最后更新于 2023-05-05