zoukankan      html  css  js  c++  java
  • MySQL Lock--LOCK IN SHARE MODE和FOR UPDATE加锁对比

    测试环境

    • MySQL版本: 5.7.30
    • 事务级别: READ-COMMITTED

    测试数据

    mysql> show create table tb1001 G
    *************************** 1. row ***************************
           Table: tb1001
    Create Table: CREATE TABLE `tb1001` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `c1` int(11) NOT NULL,
      `c2` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `idx_c1` (`c1`)
    ) ENGINE=InnoDB AUTO_INCREMENT=524273 DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> select * from tb1001 limit 10;
    +----+----+----+
    | id | c1 | c2 |
    +----+----+----+
    |  1 |  1 |  1 |
    |  2 |  2 |  2 |
    |  3 |  3 |  3 |
    | 10 | 10 | 10 |
    | 11 | 11 | 11 |
    | 12 | 12 | 12 |
    | 13 | 13 | 13 |
    | 14 | 14 | 14 |
    | 15 | 15 | 15 |
    | 16 | 16 | 16 |
    +----+----+----+
    10 rows in set (0.00 sec)
    
    

    操作对比01

    对于不需要回表查询的等值查询,如

    select c1 from tb1001 where c1=3 lock in share mode;
    
    产生1条行锁,无间隙锁
    在idx_c1上对c1=3的1条记录加锁。
    
    • 当不需要回表查找时,lock in share mode方式在二级索引上对满足条件的索引记录加锁,不会对满足条件的索引记录的下一条记录加行锁和间隙锁。
    select c1 from tb1001 where c1=3 for update;
    
    产生2条行锁,无间隙锁
    在idx_c1上对c1=3的1条记录加锁。
    在主键上对id=3的1条记录加锁。
    
    • 当不需要回表查找时,for update方式在二级索引+主键索引上对满足条件的索引记录加锁,不会对满足条件的索引记录的下一条记录加行锁和间隙锁。

    操作对比02

    对于需要回表查询的等值查询,如:

    select * from tb1001 where c1=3 lock in share mode;
    
    产生2条行锁,无间隙锁
    在idx_c1上对c1=3的1条记录加锁。
    在主键上对id=3的1条记录加锁。
    
    select * from tb1001 where c1=3 for update;
    
    产生2条行锁,无间隙锁
    在idx_c1上对c1=3的1条记录加锁。
    在主键上对id=3的1条记录加锁。
    
    • lock in share mode方式和for update方式都会对二级索引+主键索引上对满足条件的索引记录加锁,不会对满足条件的索引记录的下一条记录加行锁和间隙锁。

    操作对比03

    对于不需要回表查询的范围查询,如

    select c1 from tb1001 where c1<10 lock in share mode;
    
    产生4条行锁,无间隙锁
    在idx_c1上对c1=[1,2,3,10]的3条记录加锁。
    
    • 当不需要回表查找时,lock in share mode方式在二级索引上对满足条件的索引记录加锁,会对满足条件的索引记录的下一条记录加行锁但不会加间隙锁。
    select c1 from tb1001 where c1<10 for update;
    
    产生6条行锁,无间隙锁
    在idx_c1上对c1=[1,2,3]的3条记录加锁。
    在主键上对id=[1,2,3]的3条记录加锁。
    
    • 当不需要回表查找时,for update方式在二级索引+主键索引上对满足条件的索引记录加锁,不会对满足条件的索引记录的下一条记录加行锁和间隙锁。

    操作对比04

    对于不需要回表查询的范围查询,如

    select * from tb1001 where c1<10 lock in share mode;
    
    产生7条行锁,无间隙锁
    在idx_c1上对c1=[1,2,3,10]的3条记录加锁。
    在主键上对id=[1,2,3]的3条记录加锁
    
    • lock in share mode方式会对二级索引+主键索引上对满足条件的索引记录加锁,并对满足条件的索引记录的下一条记录在二级索引上加行锁,但不会对"满足条件的索引记录的下一条记录"在主键索引上加行锁,也不会加任何间隙锁。
    select * from tb1001 where c1<10 for update;
    
    产生6条行锁,无间隙锁
    在idx_c1上对c1=[1,2,3]的3条记录加锁。
    在主键上对id=[1,2,3]的3条记录加锁
    
    • for update方式都会对二级索引+主键索引上对满足条件的索引记录加锁,不会对满足条件的索引记录的下一条记录加行锁和间隙锁。
  • 相关阅读:
    weekly review 200908: Talk Show of ASP.NET
    weeklyreview 200911: Drowse of Spring
    数据库中标识种子(否,是,是(不用于复制))解释
    Hashtable.ContainsKey跟Hashtable.Contains的区别
    【Oracle学习起步1】用户解锁及密码输入问题
    C#弹出对话框实现
    因为文件组 'PRIMARY' 已满。
    SQL删除数据的各种方式总结
    C standard library contents
    scanf("%c",&c)前的printf函数调用问题
  • 原文地址:https://www.cnblogs.com/gaogao67/p/14659764.html
Copyright © 2011-2022 走看看