数据如下
| 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锁