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

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

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

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

  1. mysql> show create table test\G
  2. ***************** 1. row ****************
  3.        Table: test
  4. Create Table: CREATE TABLE `test` (
  5.   `id` int(11) DEFAULT NULL,
  6.   UNIQUE KEY `uniq_id` (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  8. 1 row in set (0.00 sec)
复制代码


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

da2dc1d237772fd1957f10cad49150ca.jpg

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

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

唯一索引上的范围查询会访问到不满足条件的第一个值为止
   这个加锁原则看似不太合理,像一个bug,因为唯一索引意味着所有的记录不能重复,理论上只需要添加记录的行锁就可以,但是实际中确实是需要访问到当前记录的下一条记录进行加锁。
游客,如果您要查看本帖隐藏内容请回复
标签: 暂无标签
lee

写了 77 篇文章,拥有财富 653,被 13 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P3 | 发表于 2023-4-1 16:02:48
嘿嘿嘿.
回复

使用道具

P4 | 发表于 2021-9-22 16:28:31
ooooooooooooooooooo
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈