深入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 ***** ooooooooooooooooooo 嘿嘿嘿.
页:
[1]