read commited(RC) 与 repeatable read(RR)的异同

聚集索引

数据如下

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锁

你可能感兴趣的:(mysq,sql,mysql)