lee 发表于 2020-9-7 21:41:10

深入MySQL--RC隔离级别下的间隙锁案例分析

MySQL在RR隔离级别下引入间隙锁来解决数据记录的幻读问题,在RC隔离级别下,通常间隙锁会消失,降级为记录锁,所以在RC隔离级别下能够提高并发写入的性能。

在某些特殊场景下,RC隔离级别也会包含间隙锁。来看这个案例:

首先我们创建一个表t3,t3只有1个字段id,id上面创建唯一索引,如下:

mysql> show create table test\G
***************** 1. row ****************
       Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
UNIQUE KEY `uniq_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

此时,在session A上执行delete操作,在session B和session C上执行insert操作,由于id是唯一索引,所以肯定会产生锁等待,如下:



要分析上面的加锁原理,首先需要下面2个知识点:

1、MySQL在唯一索引上加锁的原则:

唯一索引上的范围查询会访问到不满足条件的第一个值为止
   这个加锁原则看似不太合理,像一个bug,因为唯一索引意味着所有的记录不能重复,理论上只需要添加记录的行锁就可以,但是实际中确实是需要访问到当前记录的下一条记录进行加锁。
**** Hidden Message *****

末日流溢 发表于 2021-9-22 16:28:31

ooooooooooooooooooo

CCL434867833 发表于 2023-4-1 16:02:48

嘿嘿嘿.
页: [1]
查看完整版本: 深入MySQL--RC隔离级别下的间隙锁案例分析