聚集索引
数据如下
id | name |
---|---|
0 | wt |
1 | lsy |
4 | dj |
查询命中
update table_a set name=mg where id=4
如果查询到了lsy这个name,将会对 id 为 4 这一行加上X锁(排他锁),这一点RC与RR将会一致的
查询未命中
update table_a set name=mg where id=3
RC将不加任何锁
RR将在(1,4)区间内加上GAP锁
辅助唯一索引
student_no | name |
---|---|
s001 | wt |
s002 | lsy |
s005 | dj |
查询命中
由于是辅助唯一索引,其中可能涉及到回表查询
update table_b set name=mg where student_no=`s002`
RR与RC都将会对student_no=s002
这一行加上X锁
student_no | name |
---|---|
s001 | wt |
s002 | lsy |
s005 | dj |
由于name不在B+数的索引中,所以存在回表查询,也就是会存在另外一张虚拟表,仅在辅助唯一索引时候出现的表
name | student_no |
---|---|
wt | s001 |
lsy | s002 |
dj | s005 |
这张虚拟表将同样在S00这一行加入X锁 |
查询未命中
RC不需要加锁
RR将会在S002与S005之间加入GAP锁,
辅助非唯一索引
name | score |
---|---|
lsy | 100 |
dj | 99 |
dj | 99 |
查询命中
update table_c set score=50 where name='dj'
RC:
将在本身表格与回表表格中的dj这两行加上X锁
RR:
将在本身表格与回表表格中的dj这两行加上X锁
将在原表lsy到dj之间加上GAP锁
将在原表的dj后面到加上GAP锁
查询未命中
RC:不加锁
RR:在B+树的key值排序中,查询数据对应的前后之间加上GAP锁,与辅助唯一索引效果一致
无索引
RC: 对每一行加上X锁
RR:对每一行加上X锁,对每两行之间间隔加上GAP锁
聚集索引且范围查询
没有很明确的规律
辅助索引且范围查询
RC: 对原表符合范围的加上X锁
对回表中对应原表中加上了X锁的行,都加上X锁
RR: 比RC中多的便是
原表中符合范围的每一行区间内,加上GAP锁
修改索引值
对表格中的行加X锁,且对其主键那一行加上X锁