RC隔离级别下:
查询参数为唯一索引:
一共加了三把锁,分别是 IX意向排他锁(表级别的锁,不影响插入)、两把X排他锁(行锁,分别对应唯一索引,主键索引)
查询参数为主键索引
两把锁,一把IX意向排他锁(不影响插入),一把对应主键的X排他锁(行锁,会锁住那一行)。
查询参数为普通索引
三把锁,分别是:IX意向排他锁(表锁)、两把X排他锁(行锁,分别对应普通索引的X锁,对应主键的X锁)。
无索引
两把锁,分别是:IX意向排他锁(表锁)、一把X排他锁(行锁,对应主键的X锁)
RR隔离级别下
查询参数为唯一索引:
三把锁:一把IX意向排他锁 (表锁,不影响插入) ,一把对应主键的X排他锁(行锁),一把对应唯一索引的X排他锁 (行锁) 。
查询参数为主键索引:
两把锁:一把IX意向排他锁(表锁,不影响插入),一把对应主键的X排他锁(行锁,影响对应主键那一行的插入)
查询参数为普通索引
四把锁:IX锁(表锁,不影响插入),两把X锁(行锁),还会加Gap 锁(间隙锁,会影响插入)
查询参数无索引
一个IX锁(表锁,不影响插入),每一行实际记录行的X锁,还有对应于supremum pseudo-record的虚拟全表行锁。这种场景,通俗点讲,其实就是锁表。