mysql 間隙鎖專題


本文研究記錄mysql間隙鎖,涉及以下情況

唯一索引

非唯一索引

范圍更新

等值更新

mysql8

mysql7

RR

RC

 

數據准備

mysql> select * from vodb.test1 limit 5;
+----+------+------+--------+------------------------+---------------------+
| id | uid  | tid  | tname  | tvalue                 | createtime          |
+----+------+------+--------+------------------------+---------------------+
|  1 |    1 |    0 | aaabbb | 有張有馳有分寸0        | 2021-04-20 14:06:44 |
|  2 |    2 |    1 | aaabbb | 有張有馳有分寸1        | 2021-04-20 14:06:44 |
|  8 |    8 |    1 | aaabbb | 有張有馳有分寸1        | 2021-04-20 14:14:25 |
|  9 |    9 |    2 | aaabbb | 有張有馳有分寸2        | 2021-04-20 14:14:25 |
| 10 |   10 |    3 | aaabbb | 有張有馳有分寸3        | 2021-04-20 14:14:25 |
+----+------+------+--------+------------------------+---------------------+
5 rows in set (0.00 sec)

 

表結構 

mysql> desc vodb.test1;
+------------+-------------+------+-----+-------------------+-------------------+
| Field      | Type        | Null | Key | Default           | Extra             |
+------------+-------------+------+-----+-------------------+-------------------+
| id         | int         | NO   | PRI | NULL              | auto_increment    |
| uid        | int         | YES  | UNI | NULL              |                   |
| tid        | int         | YES  | MUL | NULL              |                   |
| tname      | varchar(12) | YES  |     | NULL              |                   |
| tvalue     | varchar(90) | YES  |     | NULL              |                   |
| createtime | datetime    | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+-------------+------+-----+-------------------+-------------------+
6 rows in set (0.00 sec)

 

 

 

mysql7、非唯一索引、范圍更新、RR

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1 where tid between 1 and 7 for update;
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(4,4,1,'a','b');

結論:會鎖定間隙,不允許其他事務插入

 

mysql7、非唯一索引、等值更新、RR

mysql> select * from test1 where tid =1 for update;
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(3,3,2,'a','b');



^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
mysql> 
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(5,5,2,'a','b');


^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted

結論:會鎖定間隙,不允許其他事務插入

 

mysql7、唯一索引、范圍更新、RR

mysql> select * from test1 where uid between 2 and 8 for update;
+----+------+------+--------+------------------------+---------------------+
| id | uid  | tid  | tname  | tvalue                 | createtime          |
+----+------+------+--------+------------------------+---------------------+
|  2 |    2 |    1 | aaabbb | 有張有馳有分寸1        | 2021-04-20 14:17:20 |
|  8 |    8 |    7 | aaabbb | 有張有馳有分寸7        | 2021-04-20 14:17:20 |
+----+------+------+--------+------------------------+---------------------+
2 rows in set (0.00 sec)
mysql> insert into vodb.test1(id,uid,tid,tname,tvalue) values(3,3,2,'a','b');


^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted

結論:會鎖定間隙,不允許其他事務插入

 

mysql7、唯一索引、等值更新、RR :會鎖定間隙,不允許其他事務插入

其他場景,mysql8 等,記錄略,結果如下

---------------------------------------------------------------------------------------------------------------

RR 級別:不管是唯一索引還是非唯一索引,更新數據鎖類型:行鎖+間隙鎖

RC 級別:不管是唯一索引還是非唯一索引,更新數據鎖類型:行鎖,無間隙鎖

---------------------------------------------------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM